From 795e24bb3df31b785f2caf1aca57769f28c55b0f Mon Sep 17 00:00:00 2001 From: jean-philippe bempel Date: Fri, 3 Apr 2026 10:34:01 +0200 Subject: [PATCH] Fix NullPointerException in Fingerprinter getStacktrace in an exception can be overridden and return null. handle this case gracefully --- .../datadog/debugger/exception/Fingerprinter.java | 12 +++++++----- .../debugger/exception/FingerprinterTest.java | 14 ++++++++++++++ 2 files changed, 21 insertions(+), 5 deletions(-) diff --git a/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/exception/Fingerprinter.java b/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/exception/Fingerprinter.java index 130f76b34b7..21435b14636 100644 --- a/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/exception/Fingerprinter.java +++ b/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/exception/Fingerprinter.java @@ -32,12 +32,14 @@ public static String fingerprint(Throwable t, ClassNameFilter classNameFiltering String typeName = clazz.getTypeName(); digest.update(typeName.getBytes()); StackTraceElement[] stackTrace = t.getStackTrace(); - for (StackTraceElement stackTraceElement : stackTrace) { - String className = stackTraceElement.getClassName(); - if (classNameFiltering.isExcluded(className)) { - continue; + if (stackTrace != null) { + for (StackTraceElement stackTraceElement : stackTrace) { + String className = stackTraceElement.getClassName(); + if (classNameFiltering.isExcluded(className)) { + continue; + } + digest.update(stackTraceElement.toString().getBytes()); } - digest.update(stackTraceElement.toString().getBytes()); } return bytesToHex(digest.digest()); } diff --git a/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/exception/FingerprinterTest.java b/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/exception/FingerprinterTest.java index 2227a542dd4..8e677c68c32 100644 --- a/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/exception/FingerprinterTest.java +++ b/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/exception/FingerprinterTest.java @@ -69,6 +69,20 @@ void emptyStacktrace() { Fingerprinter.fingerprint(new EmptyException("test"), classNameFiltering)); } + @Test + void nullStacktrace() { + assertEquals( + "35ae5d9aa4d7179a7d36838ca6266ea459a7cbb6ebc92afc24098bc85cad586", + Fingerprinter.fingerprint( + new RuntimeException("test") { + @Override + public StackTraceElement[] getStackTrace() { + return null; + } + }, + classNameFiltering)); + } + static class EmptyException extends Exception { public EmptyException(String message) { super(message, null, false, false);