You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by Ma...@providersolutions.net on 2002/03/29 22:30:59 UTC

MultipartRequest upload failing with large files

Hi folks.  Jason Hunter suggested I send this notice to the list, so here
it is.

----- Forwarded by Matt Cowley/Providersolutions on 03/29/02 04:33 PM -----
                                                                                                                   
                    Matt Cowley                                                                                    
                                         To:     serlvet-interest@java.sun.com                                     
                    03/26/02             cc:                                                                       
                    03:04 PM             Subject:     MultipartRequest upload failing with large files             
                                                                                                                   
                                                                                                                   



Hi folks.  We're having problems uploading large files with the OReilly
MultipartRequest class when using ssl.  Files under 10mb work fine.  If we
upload more than that (in one large file or a combination of smaller ones),
we get an Array Index Out of Bounds exception (dump follows).  This only
happens going through ssl; non-secure uploads work fine with very large
files.

I found a very similar bug report on the servlets.com site (description
follows), and upgraded to the 19-Jun-2001 version of the
com.oreilly.servlet package.  Same symptoms after the upgrade.

Any ideas or help would be most appreciated.  Thanks.


-matt


Environment:
------------
- Win2000 Server, patched up to latest levels
- Tomcat 4.0.1 Binary distribution, running as a service
- IIS 5.0, using ISAPI_Redirect.dll dated 12/08/01 (Thank you Henri Gomez!)
- SSL Enabled through IIS
- I have several servers with similar environments.  Some servers have
multiple logical web servers with multiple Tomcat instances.  This
particular server has only one instance of each.  However, the same
behavior
is observed on any server/instance with SSL.

Facts:
------
1] This only happens on https://, all other forms work fine.
2] This only happens on files larger than just under 11MB (11,172,378
bytes,
plus or minus a few bytes for filename payload).
3] The "Assert Failed" error comes from Ajp13.java, Ajp13Packet.java, or
MsgAjp.java.  I am not a Java programmer (yes, another one of those
'systems' guys), but was able to dig throught the source to find the actual
system.out lines.
4] 11,172,378 / 1364 = 8191+-, the same size as the ajp packet.  Why 1364
ajp packets?  Anything smaller works fine.


Here's the bug report from servlets.com:
                                                                                                        
                                                                                                        
                                                                                                        
 Bug: File upload does not work with Apache JServ when uploading large binary files                     
                                                                                                        
                                                                                                        
 Symptoms: When handling a file upload the com.oreilly.servlet.MultipartRequest class throws an         
 ArrayIndexOutOfBoundsException.                                                                        
                                                                                                        
                                                                                                        
 Reason: JServ supports the older Servlet API 2.0 and in the API 2.0 source code for                    
 javax.servlet.ServletInputStream there's a bug in the readLine(byte[] buf, int off, int len) method    
 where the len parameter is ignored, and as a result reading input lines that exceed the buf length     
 will throw an ArrayIndexOutOfBoundsException.                                                          
                                                                                                        
                                                                                                        
 Workaround: The com.oreilly.servlet library has implemented its own buffering to work around this      
 issue. If you're using another library, upgrade to a server that supports Servlet API 2.1 or later.    
                                                                                                        
                                                                                                        
                                                                                                        
                                                                                                        
                                                                                                        
 Here's the exception dump:                                                                             
 14:24:22,311 [Ajp13Processor[8009][24]] ERROR com.psc.ams.servlets.PSCUploadFilesByExtension -         
 Unexpected Exception occured in PSCUploadFiles.doPost().                                               
 java.lang.ArrayIndexOutOfBoundsException                                                               
      at java.lang.System.arraycopy(Native Method)                                                      
      at org.apache.ajp.Ajp13Packet.getBytes(Ajp13Packet.java:459)                                      
      at org.apache.ajp.Ajp13.refillReadBuffer(Ajp13.java:641)                                          
      at org.apache.ajp.Ajp13.doRead(Ajp13.java:594)                                                    
      at org.apache.ajp.tomcat4.Ajp13InputStream.read(Ajp13InputStream.java:99)                         
      at                                                                                                
 com.oreilly.servlet.multipart.BufferedServletInputStream.fill(BufferedServletInputStream.java:63)      
      at                                                                                                
 com.oreilly.servlet.multipart.BufferedServletInputStream.readLine(BufferedServletInputStream.java:107) 
      at                                                                                                
 com.oreilly.servlet.multipart.LimitedServletInputStream.readLine(LimitedServletInputStream.java:59)    
      at com.oreilly.servlet.multipart.PartInputStream.fill(PartInputStream.java:92)                    
      at com.oreilly.servlet.multipart.PartInputStream.read(PartInputStream.java:190)                   
      at com.oreilly.servlet.multipart.PartInputStream.read(PartInputStream.java:151)                   
      at com.oreilly.servlet.multipart.FilePart.write(FilePart.java:186)                                
      at com.oreilly.servlet.multipart.FilePart.writeTo(FilePart.java:145)                              
      at com.oreilly.servlet.MultipartRequest.<init>(MultipartRequest.java:139)                         
      at com.psc.ams.servlets.PSCUploadFilesByExtension.doPost(PSCUploadFilesByExtension.java:480)      
      at javax.servlet.http.HttpServlet.service(HttpServlet.java:760)                                   
      at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)                                   
      at                                                                                                
 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:247)      
      at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:193)      
      at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:243)            
      at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:566)                
      at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472)                    
      at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943)                          
      at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:201)            
      at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:566)                
      at org.apache.catalina.valves.RequestDumperValve.invoke(RequestDumperValve.java:221)              
      at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:564)                
      at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472)                    
      at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943)                          
      at org.apache.catalina.core.StandardContext.invoke(StandardContext.java:2344)                     
      at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164)                  
      at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:566)                
      at org.apache.catalina.valves.ErrorDispatcherValve.invoke(ErrorDispatcherValve.java:170)          
      at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:564)                
      at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:170)                  
      at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:564)                
      at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472)                    
      at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943)                          
      at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:163)              
      at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:566)                
      at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472)                    
      at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943)                          
      at org.apache.ajp.tomcat4.Ajp13Processor.process(Ajp13Processor.java:371)                         
      at org.apache.ajp.tomcat4.Ajp13Processor.run(Ajp13Processor.java:424)                             
      at java.lang.Thread.run(Thread.java:484)                                                          
                                                                                                        
                                                                                                        
                                                                                                        
                                                                                                        
                                                                                                        







--
To unsubscribe, e-mail:   <ma...@jakarta.apache.org>
For additional commands, e-mail: <ma...@jakarta.apache.org>


Re: MultipartRequest upload failing with large files

Posted by Bojan Smojver <bo...@binarix.com>.
Don't use TC 4, but I can confirm that similar does work in TC
3.3/mod_jk 1.2/Apache 1.3.23/mod_ssl 2.8.7. I've just uploaded a 17 MB
binary file without problems (given there is enough memory for JVM).
However, I don't use O'Reilly class (*VERY* silly license), but my own
(which you can get from here
ftp://ftp.binarix.com/pub/params/params.tar.gz, it is licensed GPL and
it comes without any documentation ;-).

Bojan

On Sat, 2002-03-30 at 08:30, Matt.Cowley@providersolutions.net wrote:
> Hi folks.  Jason Hunter suggested I send this notice to the list, so here
> it is.
> 
> ----- Forwarded by Matt Cowley/Providersolutions on 03/29/02 04:33 PM -----
>                                                                                                                    
>                     Matt Cowley                                                                                    
>                                          To:     serlvet-interest@java.sun.com                                     
>                     03/26/02             cc:                                                                       
>                     03:04 PM             Subject:     MultipartRequest upload failing with large files             
>                                                                                                                    
>                                                                                                                    
> 
> 
> 
> Hi folks.  We're having problems uploading large files with the OReilly
> MultipartRequest class when using ssl.  Files under 10mb work fine.  If we
> upload more than that (in one large file or a combination of smaller ones),
> we get an Array Index Out of Bounds exception (dump follows).  This only
> happens going through ssl; non-secure uploads work fine with very large
> files.
> 
> I found a very similar bug report on the servlets.com site (description
> follows), and upgraded to the 19-Jun-2001 version of the
> com.oreilly.servlet package.  Same symptoms after the upgrade.
> 
> Any ideas or help would be most appreciated.  Thanks.
> 
> 
> -matt
> 
> 
> Environment:
> ------------
> - Win2000 Server, patched up to latest levels
> - Tomcat 4.0.1 Binary distribution, running as a service
> - IIS 5.0, using ISAPI_Redirect.dll dated 12/08/01 (Thank you Henri Gomez!)
> - SSL Enabled through IIS
> - I have several servers with similar environments.  Some servers have
> multiple logical web servers with multiple Tomcat instances.  This
> particular server has only one instance of each.  However, the same
> behavior
> is observed on any server/instance with SSL.
> 
> Facts:
> ------
> 1] This only happens on https://, all other forms work fine.
> 2] This only happens on files larger than just under 11MB (11,172,378
> bytes,
> plus or minus a few bytes for filename payload).
> 3] The "Assert Failed" error comes from Ajp13.java, Ajp13Packet.java, or
> MsgAjp.java.  I am not a Java programmer (yes, another one of those
> 'systems' guys), but was able to dig throught the source to find the actual
> system.out lines.
> 4] 11,172,378 / 1364 = 8191+-, the same size as the ajp packet.  Why 1364
> ajp packets?  Anything smaller works fine.
> 
> 
> Here's the bug report from servlets.com:
>                                                                                                         
>                                                                                                         
>                                                                                                         
>  Bug: File upload does not work with Apache JServ when uploading large binary files                     
>                                                                                                         
>                                                                                                         
>  Symptoms: When handling a file upload the com.oreilly.servlet.MultipartRequest class throws an         
>  ArrayIndexOutOfBoundsException.                                                                        
>                                                                                                         
>                                                                                                         
>  Reason: JServ supports the older Servlet API 2.0 and in the API 2.0 source code for                    
>  javax.servlet.ServletInputStream there's a bug in the readLine(byte[] buf, int off, int len) method    
>  where the len parameter is ignored, and as a result reading input lines that exceed the buf length     
>  will throw an ArrayIndexOutOfBoundsException.                                                          
>                                                                                                         
>                                                                                                         
>  Workaround: The com.oreilly.servlet library has implemented its own buffering to work around this      
>  issue. If you're using another library, upgrade to a server that supports Servlet API 2.1 or later.    
>                                                                                                         
>                                                                                                         
>                                                                                                         
>                                                                                                         
>                                                                                                         
>  Here's the exception dump:                                                                             
>  14:24:22,311 [Ajp13Processor[8009][24]] ERROR com.psc.ams.servlets.PSCUploadFilesByExtension -         
>  Unexpected Exception occured in PSCUploadFiles.doPost().                                               
>  java.lang.ArrayIndexOutOfBoundsException                                                               
>       at java.lang.System.arraycopy(Native Method)                                                      
>       at org.apache.ajp.Ajp13Packet.getBytes(Ajp13Packet.java:459)                                      
>       at org.apache.ajp.Ajp13.refillReadBuffer(Ajp13.java:641)                                          
>       at org.apache.ajp.Ajp13.doRead(Ajp13.java:594)                                                    
>       at org.apache.ajp.tomcat4.Ajp13InputStream.read(Ajp13InputStream.java:99)                         
>       at                                                                                                
>  com.oreilly.servlet.multipart.BufferedServletInputStream.fill(BufferedServletInputStream.java:63)      
>       at                                                                                                
>  com.oreilly.servlet.multipart.BufferedServletInputStream.readLine(BufferedServletInputStream.java:107) 
>       at                                                                                                
>  com.oreilly.servlet.multipart.LimitedServletInputStream.readLine(LimitedServletInputStream.java:59)    
>       at com.oreilly.servlet.multipart.PartInputStream.fill(PartInputStream.java:92)                    
>       at com.oreilly.servlet.multipart.PartInputStream.read(PartInputStream.java:190)                   
>       at com.oreilly.servlet.multipart.PartInputStream.read(PartInputStream.java:151)                   
>       at com.oreilly.servlet.multipart.FilePart.write(FilePart.java:186)                                
>       at com.oreilly.servlet.multipart.FilePart.writeTo(FilePart.java:145)                              
>       at com.oreilly.servlet.MultipartRequest.<init>(MultipartRequest.java:139)                         
>       at com.psc.ams.servlets.PSCUploadFilesByExtension.doPost(PSCUploadFilesByExtension.java:480)      
>       at javax.servlet.http.HttpServlet.service(HttpServlet.java:760)                                   
>       at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)                                   
>       at                                                                                                
>  org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:247)      
>       at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:193)      
>       at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:243)            
>       at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:566)                
>       at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472)                    
>       at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943)                          
>       at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:201)            
>       at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:566)                
>       at org.apache.catalina.valves.RequestDumperValve.invoke(RequestDumperValve.java:221)              
>       at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:564)                
>       at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472)                    
>       at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943)                          
>       at org.apache.catalina.core.StandardContext.invoke(StandardContext.java:2344)                     
>       at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164)                  
>       at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:566)                
>       at org.apache.catalina.valves.ErrorDispatcherValve.invoke(ErrorDispatcherValve.java:170)          
>       at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:564)                
>       at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:170)                  
>       at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:564)                
>       at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472)                    
>       at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943)                          
>       at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:163)              
>       at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:566)                
>       at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472)                    
>       at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943)                          
>       at org.apache.ajp.tomcat4.Ajp13Processor.process(Ajp13Processor.java:371)                         
>       at org.apache.ajp.tomcat4.Ajp13Processor.run(Ajp13Processor.java:424)                             
>       at java.lang.Thread.run(Thread.java:484)                                                          
>                                                                                                         
>                                                                                                         
>                                                                                                         
>                                                                                                         
>                                                                                                         
> 
> 
> 
> 
> 
> 
> 
> --
> To unsubscribe, e-mail:   <ma...@jakarta.apache.org>
> For additional commands, e-mail: <ma...@jakarta.apache.org>
> 



--
To unsubscribe, e-mail:   <ma...@jakarta.apache.org>
For additional commands, e-mail: <ma...@jakarta.apache.org>