[ 
https://issues.apache.org/jira/browse/CXF-4684?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13533931#comment-13533931
 ] 

Glen Mazza commented on CXF-4684:
---------------------------------

Hi Aki, sorry I hadn't gotten to your dev list message, and my knowledge in 
this area is incomplete.  The fact that the original submitter of this bug 
wrote "The SOAPFault in CXF will only throw the 'Fault occurred while 
processing.' message rather than the original NPE message." shows he doesn't 
understand the Pen-testing 101 rule *not* to pass service-side exception bug 
details back to the client.  He didn't mention anything about the JAX-WS 
specification, so that wasn't his motivation.

Why is his motivation important?  Right now, he apparently feels that if you 
have a database space error, somehow the SOAP client should receive a message 
like "Wizard RDMBS error: Table AdminAccountName.MY_STUFF on server camel07 is 
full, please expand more space for it."  That's a training issue, and once he 
understands that's a no-no, I suspect he would be likely going to request a 
return to 'Fault occurred while processing' again, rather than defend the new 
implementation based on the apparent rule in JAX-WS 10.2.2.  Very few people 
indeed truly want service-side error messages propagated back to the client 
(incidentally, NPEs are embarrassing for all concerned and developers don't 
like it when their web service stacks embarrass them to their customers in such 
a manner.)

Further, "NullPointerException" is a Java-language construct, while SOAP is 
language-independent.  There shouldn't be any need to return Java-language 
constructs to the client, as that would incorrectly imply the SOAP client base 
may base logic on the fact that the SOAP service is implemented in Java.

I'm confused a little about your statement: "But I am more concerned about some 
unknown user extended runtime exception that overwrites its toString to do more 
than writing its class name."  Does this new change *facilitate* that (they can 
override toString() now?) or *hinder* that (now if they tried to overwrite it, 
the client will still get an "NPE" message)?  If the latter, perhaps this 
change does more good than harm, but if the former, I would say CXF should 
tighten up and not allow this, to protect systems against sloppier developers 
putting too much info in their error messages back to the client.

Anyway, CXF has several masters--the WSDL, JAX-WS, JAX-RS and WS-I Basic 
Profile (and Basic Security Profile) specs--and as you know, we can't serve 
more than one perfectly.  I believe CXF has already tightened itself up in a 
few places w.r.t. the WS-I profiles, becoming invalid as a consequence with the 
more-easygoing WSDL and JAX-WS specs, both of which allow more than what WS-I 
does.  This would appear to be something where going the safer route rather 
than strict compliance with any specific JAX-WS rule would appear justified.  I 
don't think this change is vetoable but my instinct would be to revert it, 
because I think its going to happen anyway (someone several months down the 
road will complain about CXF improperly sending internal error messages to the 
client) but if you wait several months to revert you may have to deal with 
backwards compatibility issues of many SOAP clients now incorrectly basing 
logic based on specific Java class exceptions being returned from the web 
service provider.
                
> SOAPFault message improvement in CXF when there is unchecked NPE
> ----------------------------------------------------------------
>
>                 Key: CXF-4684
>                 URL: https://issues.apache.org/jira/browse/CXF-4684
>             Project: CXF
>          Issue Type: Bug
>          Components: WS-* Components
>    Affects Versions: 2.6.2
>            Reporter: Bin Zhu
>            Assignee: Aki Yoshida
>         Attachments: CXF-4684.patch
>
>
> When there is unchecked NPE thrown, the SOAPFault in CXF will only throw the 
> "Fault occurred while processing." message rather than the original NPE 
> message.
> Analysis:
> 1. In org.apache.cxf.binding.soap.interceptor.Soap11FaultOutInterceptor and 
> org.apache.cxf.binding.soap.interceptor.Soap12FaultOutInterceptor,
> It will check fault.getMessage() :
>                 if (fault.getMessage() != null) {
>                     if (message.get("forced.faultstring") != null) {
>                         writer.writeCharacters((String) 
> message.get("forced.faultstring"));
>                     } else {
>                         writer.writeCharacters(fault.getMessage());
>                     }
>                 } else {
>                     writer.writeCharacters("Fault occurred while 
> processing.");
>                 }
> But for NPE, the fault.getMessage() will return null instead of the 
> "java.lang.NullPointerException" in the getMessage() in NPE.
> 2. 
> Fault.getMessage will return null in the NPE scenario while it's super class 
> Throwable will not.
> When there is NPE, the message attribute in Fault is null while the 
> detailMessageAtrribute is "java.lang.NullPointerException".
> Details:
> SoapFault->Fault->UncheckedException->RuntimeException->Exception->Throwable. 
> //  SoapFault->Fault means SoapFault class extends Fault class
> UncheckedException.getMessage:
>     public String getMessage() {
>         if (null != message) {
>             return message.toString();
>         }
>         return null;
>     }
> Throwable.getMessage:
> public String getMessage() {
>       return detailMessage;
> }

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira

Reply via email to