Andrea Cosentino created CAMEL-24262:
----------------------------------------

             Summary: camel-aws2: producer catch blocks eagerly dereference 
nullable awsErrorDetails() when logging the error code
                 Key: CAMEL-24262
                 URL: https://issues.apache.org/jira/browse/CAMEL-24262
             Project: Camel
          Issue Type: Bug
          Components: camel-aws
            Reporter: Andrea Cosentino


h3. Summary

Related to CAMEL-24251 (same root cause, different location). Across 28 AWS v2 
producers, the {{catch (AwsServiceException ase)}} blocks log the error code 
with:

{code:java}
} catch (AwsServiceException ase) {
    LOG.trace("List Brokers command returned the error code {}", 
ase.awsErrorDetails().errorCode());
    throw ase;
}
{code}

{{AwsServiceException.awsErrorDetails()}} is nullable (see CAMEL-24251, where 
the same dereference is reproduced throwing NPE in the producer health checks). 
Here the dereference sits on the *main error-handling path*: if 
{{awsErrorDetails()}} is null, {{ase.awsErrorDetails().errorCode()}} throws 
{{NullPointerException}} and the original {{AwsServiceException}} is *masked* 
by that NPE at the {{throw}} site.

Because the expression is a method argument, Java evaluates it *eagerly* — so 
this happens even when TRACE logging is disabled. It is not gated by the log 
level.

h3. Scope

358 such log sites across 28 producer files (every operation's catch block). 
For a genuine AWS service error the SDK populates {{awsErrorDetails}}, so the 
practical trigger is narrow (synthetic / edge-case exceptions, as in 
CAMEL-24251) — this is *lower severity* than CAMEL-24251, filed for consistency 
and defense-in-depth rather than a frequently-hit crash.

h3. Proposed fix (low-churn)

Add a null-safe helper in {{camel-aws-common}}, e.g.:

{code:java}
public static String errorCode(AwsServiceException e) {
    return e.awsErrorDetails() != null ? e.awsErrorDetails().errorCode() : null;
}
{code}

and migrate the log sites to {{AwsExceptionHelper.errorCode(ase)}} 
opportunistically (e.g. per component, alongside other work), rather than one 
358-site sweep. This also removes the eager-deref foot-gun for future producers.

Raised from an automated audit of the camel-aws components.

----
_Reported by Claude Code on behalf of acosentino._



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to