AttachmentDeserializer/LazyLoading Attachment Collection enters into continuous 
while loop for input with missing boundary
--------------------------------------------------------------------------------------------------------------------------

                 Key: CXF-2706
                 URL: https://issues.apache.org/jira/browse/CXF-2706
             Project: CXF
          Issue Type: Bug
          Components: Core
    Affects Versions: 2.2.6, 2.2.5, 2.2.4, 2.2.3, 2.2.2
         Environment: All known platforms to mankind
            Reporter: Mustafa Sezgin


We recently came across an issue in our production environments where we 
detected http processor threads that had been alive for over a week chewing up 
CPU. By inspecting thread dumps we found that our external API's (JAX-RS) were 
the problem with CXF being the culprit. All processor threads had the same 
stack trace and were all related to POST requests which were multipart based. 

Upon further investigation the cause was identified to be an incorrectly sent 
multipart input with a missing end boundary. The result of this was the 
LazyAttachmentCollection entering into a continuous loop 'waiting' for more 
data even though there was none with the client end point having long gone.

I have put together a test case demonstrating this. I have tried to imitate the 
CXF code path as much as possible (AttachmentInInterceptor).  

I consider this to be a fairly serious issue as mistakes like this will likely 
happen frequently by developers and it would only take 8 of these requests to 
consume an 8 core cpu and its 'game over man'...

I aim to have a patch implemented for this as soon as possible when i have some 
free time but im hoping you guys might be able get onto it sooner than me as a 
fix for this would greatly appreciated...

A sample stack trace from Tomcat is below 

{noformat}
                at java.lang.System.arraycopy(Native Method)
                at 
java.io.PushbackInputStream.unread(PushbackInputStream.java:218)
                at 
org.apache.cxf.attachment.MimeBodyPartInputStream.hasData(MimeBodyPartInputStream.java:98)
                at 
org.apache.cxf.attachment.MimeBodyPartInputStream.processBuffer(MimeBodyPartInputStream.java:134)
                at 
org.apache.cxf.attachment.MimeBodyPartInputStream.read(MimeBodyPartInputStream.java:76)
                at java.io.InputStream.read(InputStream.java:85)
                at 
org.apache.cxf.attachment.DelegatingInputStream.read(DelegatingInputStream.java:77)
                at org.apache.cxf.helpers.IOUtils.copy(IOUtils.java:112)
                at org.apache.cxf.helpers.IOUtils.copy(IOUtils.java:75)
                at 
org.apache.cxf.attachment.AttachmentDataSource.<init>(AttachmentDataSource.java:39)
                at 
org.apache.cxf.attachment.AttachmentUtil.createAttachment(AttachmentUtil.java:168)
                at 
org.apache.cxf.attachment.AttachmentDeserializer.createAttachment(AttachmentDeserializer.java:283)
                at 
org.apache.cxf.attachment.AttachmentDeserializer.readNext(AttachmentDeserializer.java:194)
                at 
org.apache.cxf.attachment.LazyAttachmentCollection.loadAll(LazyAttachmentCollection.java:52)
                at 
org.apache.cxf.attachment.LazyAttachmentCollection.size(LazyAttachmentCollection.java:99)
                at 
org.apache.cxf.jaxrs.ext.MessageContextImpl.createAttachments(MessageContextImpl.java:147)
                at 
org.apache.cxf.jaxrs.ext.MessageContextImpl.get(MessageContextImpl.java:58)
                at 
org.apache.cxf.jaxrs.impl.tl.ThreadLocalMessageContext.get(ThreadLocalMessageContext.java:38)
                at 
org.apache.cxf.jaxrs.utils.multipart.AttachmentUtils.getMultipartBody(AttachmentUtils.java:81)
                at 
org.apache.cxf.jaxrs.utils.multipart.AttachmentUtils.getAttachments(AttachmentUtils.java:86)
                at 
org.apache.cxf.jaxrs.provider.MultipartProvider.readFrom(MultipartProvider.java:76)
                at 
org.apache.cxf.jaxrs.utils.JAXRSUtils.readFromMessageBody(JAXRSUtils.java:827)
                at 
org.apache.cxf.jaxrs.utils.JAXRSUtils.processParameter(JAXRSUtils.java:470)
                at 
org.apache.cxf.jaxrs.utils.JAXRSUtils.processParameters(JAXRSUtils.java:435)
                at 
org.apache.cxf.jaxrs.interceptor.JAXRSInInterceptor.processRequest(JAXRSInInterceptor.java:194)
                at 
org.apache.cxf.jaxrs.interceptor.JAXRSInInterceptor.handleMessage(JAXRSInInterceptor.java:65)
                at 
org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:236)
                - locked <0x00002aaae3f66ac8> (a 
org.apache.cxf.phase.PhaseInterceptorChain)
                at 
org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:89)
                at 
org.apache.cxf.transport.servlet.ServletDestination.invoke(ServletDestination.java:99)
                at 
org.apache.cxf.transport.servlet.ServletController.invokeDestination(ServletController.java:368)
                at 
org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:146)
                at 
org.apache.cxf.transport.servlet.AbstractCXFServlet.invoke(AbstractCXFServlet.java:163)
                at 
org.apache.cxf.transport.servlet.AbstractCXFServlet.doPost(AbstractCXFServlet.java:141)
                at javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
                at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)

{noformat}

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to