{"record":{"id":"7d1669c247bfa23d","repo":"pinpoint-apm/pinpoint","slug":"handler","errorCode":null,"errorMessage":"handler","messagePattern":"handler","errorType":"exception","errorClass":"NullPointerException","httpStatus":null,"severity":"error","filePath":"agent-module/bootstraps/bootstrap-core/src/main/java/com/navercorp/pinpoint/bootstrap/lambda/UnsafeDelegatorJava8.java","lineNumber":31,"sourceCode":" * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.navercorp.pinpoint.bootstrap.lambda;\n\nimport com.navercorp.pinpoint.bootstrap.instrument.lambda.LambdaBytecodeHandler;\nimport sun.misc.Unsafe;\n\n/**\n * @author Woonduk Kang(emeroad)\n */\npublic class UnsafeDelegatorJava8 {\n    private static final Unsafe UNSAFE = Unsafe.getUnsafe();\n    private static LambdaBytecodeHandler handler;\n\n    public static boolean register(LambdaBytecodeHandler handler) {\n        if (handler == null) {\n            throw new NullPointerException(\"handler\");\n        }\n        final LambdaBytecodeHandler localCopy = UnsafeDelegatorJava8.handler;\n        if (localCopy == null) {\n            UnsafeDelegatorJava8.handler = handler;\n            return true;\n        } else {\n            System.err.println(\"LambdaBytecodeHandler already registered\");\n            return false;\n        }\n    }\n\n    public static Class<?> defineAnonymousClass(Class<?> hostClass, byte[] data, Object[] cpPatches) {\n        if (hostClass == null || data == null) {\n            throw new NullPointerException();\n        }\n        if (hostClass.isArray() || hostClass.isPrimitive()) {\n            throw new IllegalArgumentException();\n        }","sourceCodeStart":13,"sourceCodeEnd":49,"githubUrl":"https://github.com/pinpoint-apm/pinpoint/blob/744c3d3075e595656abb1ae331ad2c0e4c9eb996/agent-module/bootstraps/bootstrap-core/src/main/java/com/navercorp/pinpoint/bootstrap/lambda/UnsafeDelegatorJava8.java#L13-L49","documentation":"UnsafeDelegatorJava8.register installs the global LambdaBytecodeHandler used to instrument lambda invocations on Java 8+. It refuses null with NullPointerException(\"handler\") and only accepts the first registration; subsequent registrations fail (return false) because the field is already set.","triggerScenarios":"Calling UnsafeDelegatorJava8.register(null); or attempting to register a second handler when one was already installed earlier in the JVM lifetime.","commonSituations":"Bootstrap ordering bugs where registration code runs twice; two agent components competing to install the lambda handler; unit tests leaking a previously registered handler in the same JVM.","solutions":["Ensure register is called exactly once with a non-null handler, guarded by the boolean return value","Check the return value of register(): false means another handler already owns the slot","In tests, isolate registration to a single setup or use a fresh JVM/classloader"],"exampleFix":"// before\nUnsafeDelegatorJava8.register(null); // NPE\n// after\nif (handler != null && !UnsafeDelegatorJava8.register(handler)) {\n    logger.warn(\"lambda handler already registered\");\n}","handlingStrategy":"type-guard","validationCode":"if (handler == null) throw new IllegalArgumentException(\"handler must not be null\");","typeGuard":"boolean registerSafe(LambdaBytecodeHandler h) { return h != null && UnsafeDelegatorJava8.register(h); }","tryCatchPattern":"try {\n    boolean installed = UnsafeDelegatorJava8.register(handler);\n    if (!installed) logger.warn(\"lambda handler already registered; ignoring\");\n} catch (NullPointerException e) {\n    if (\"handler\".equals(e.getMessage())) {\n        logger.error(\"register(null) is not allowed\", e);\n    } else { throw e; }\n}","preventionTips":["Register the lambda handler once during agent bootstrap, before any lambdas are instrumented","Check register()'s boolean return rather than assuming success","Make the handler reference final and initialize it before registration"],"tags":["null-argument","lambda","bootstrap"],"backgroundTag":"null-argument","analyzedSha":"744c3d3075e595656abb1ae331ad2c0e4c9eb996","analyzedAt":"2026-09-07T18:48:45.289Z","contentChangedAt":"2026-09-07T18:48:45.289Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}