From fff89425e2722b7addfcffb685f3da6d92e53dff Mon Sep 17 00:00:00 2001 From: Solaris-star <820622658@qq.com> Date: Tue, 28 Jul 2026 19:30:37 +0800 Subject: [PATCH] fix(api): handle null context in Baggage.fromContext and fromContextOrNull Baggage.fromContext(null) and Baggage.fromContextOrNull(null) threw NullPointerException because both dereferenced the supplied Context without a null guard. This is inconsistent with Span.fromContext and Span.fromContextOrNull, which already log via ApiUsageLogger and return a safe fallback (getInvalid() / null). Apply the same pattern: - fromContext(null) logs and returns Baggage.empty() - fromContextOrNull(null) logs and returns null Adds two tests covering the null-context paths. Fixes #8665 --- .../java/io/opentelemetry/api/baggage/Baggage.java | 9 +++++++++ .../opentelemetry/api/baggage/BaggageContextTest.java | 10 ++++++++++ 2 files changed, 19 insertions(+) diff --git a/api/all/src/main/java/io/opentelemetry/api/baggage/Baggage.java b/api/all/src/main/java/io/opentelemetry/api/baggage/Baggage.java index 12b81d7b033..243ce157b0a 100644 --- a/api/all/src/main/java/io/opentelemetry/api/baggage/Baggage.java +++ b/api/all/src/main/java/io/opentelemetry/api/baggage/Baggage.java @@ -5,6 +5,7 @@ package io.opentelemetry.api.baggage; +import io.opentelemetry.common.impl.ApiUsageLogger; import io.opentelemetry.context.Context; import io.opentelemetry.context.ImplicitContextKeyed; import java.util.Map; @@ -52,6 +53,10 @@ static Baggage current() { * Baggage} if there is no baggage in the context. */ static Baggage fromContext(Context context) { + if (context == null) { + ApiUsageLogger.logNullParam(Baggage.class, "fromContext", "context"); + return empty(); + } Baggage baggage = context.get(BaggageContextKey.KEY); return baggage != null ? baggage : empty(); } @@ -62,6 +67,10 @@ static Baggage fromContext(Context context) { */ @Nullable static Baggage fromContextOrNull(Context context) { + if (context == null) { + ApiUsageLogger.logNullParam(Baggage.class, "fromContextOrNull", "context"); + return null; + } return context.get(BaggageContextKey.KEY); } diff --git a/api/all/src/test/java/io/opentelemetry/api/baggage/BaggageContextTest.java b/api/all/src/test/java/io/opentelemetry/api/baggage/BaggageContextTest.java index b8dfd63e168..b2c6232ee94 100644 --- a/api/all/src/test/java/io/opentelemetry/api/baggage/BaggageContextTest.java +++ b/api/all/src/test/java/io/opentelemetry/api/baggage/BaggageContextTest.java @@ -54,4 +54,14 @@ void testGetBaggageWithoutDefault_ExplicitContext() { Context context = Context.root().with(baggage); assertThat(Baggage.fromContextOrNull(context)).isSameAs(baggage); } + + @Test + void fromContext_null() { + assertThat(Baggage.fromContext(null)).isSameAs(Baggage.empty()); + } + + @Test + void fromContextOrNull_null() { + assertThat(Baggage.fromContextOrNull(null)).isNull(); + } }