[jcifs] LARGE_READX / LARGE_WRITEX support

Christopher R. Hertel crh at ubiqx.mn.org
Wed Oct 19 18:52:43 GMT 2005


There are some notes scattered about in the SMB section of the CIFS book 
regarding LARGE_READ and LARGE_WRITE...

On Wed, Oct 19, 2005 at 02:35:20PM -0400, Michael B Allen wrote:
> The fixes are great. I'll have to look at Encdec closely. Thanks. I'll
> put the LARGE_{READ,WRITE}X in my todo folder. I seem to recall rejecting
> a patch for this a while back but I don't recall why.
> 
> Mike
> 
> On Wed, 19 Oct 2005 17:03:34 +0200
> Thomas Krammer <Thomas_Krammer at avid.com> wrote:
> 
> > Hi,
> > 
> > the attached patch adds LARGE_READX / LARGE_WRITEX support to jCIFS 
> > 1.2.6. It also fixes some problems I found along the way.
> > 
> > 1) Debug output in Transport.java
> > 
> > The patch removes some debug output that is printed to stdout.
> > 
> > 2) Integer overflow in SmbTransport.java
> > 
> > If you execute the following code:
> > 
> > SmbFile serverFile = ....
> > SmbRandomAccessFile ra = new SmbRandomAccessFile(serverFile, "rw");
> > 
> > int BUFFER_SIZE = Short.MAX_VALUE;
> > 
> > byte[] buffer = new byte[BUFFER_SIZE];
> > 
> > ra.read(buffer);
> > 
> > you will get the following exception:
> > 
> > jcifs.util.transport.TransportException: Transport1 timedout waiting for 
> > response to 
> > SmbComReadAndX[command=SMB_COM_READ_ANDX,received=false,errorCode=0,flags=0x0018,flags2=0xC003,signSeq=0,tid=2048,pid=10207,uid=2048,mid=475,wordCount=12,byteCount=0,andxCommand=0xFF,andxOffset=0,fid=16384,offset=0,maxCount=32767,minCount=32767,openTimeout=-1,remaining=0,offset=0]
> >          at jcifs.util.transport.Transport.sendrecv(Transport.java:74)
> >          at jcifs.smb.SmbTransport.send(SmbTransport.java:580)
> >          at jcifs.smb.SmbSession.send(SmbSession.java:229)
> >          at jcifs.smb.SmbTree.send(SmbTree.java:102)
> >          at jcifs.smb.SmbFile.send(SmbFile.java:688)
> >          at jcifs.smb.SmbRandomAccessFile.read(SmbRandomAccessFile.java:86)
> >          at jcifs.smb.SmbRandomAccessFile.read(SmbRandomAccessFile.java:69)
> > 
> > The reason for this error is an integer overflow in 
> > SmbTransport.doRecv() line 422. If the specified buffer size is greater 
> > than Short.MAX_VALUE - SMB_HEADER_LENGTH the package size gets negative 
> > and the package is rejected. That's because Encdec.dec_uint16be returns 
> > a short instead of an int.
> > 
> > Please note that there are more similar errors in Encdec (for example 
> > dec_uint32be returns an int instead of a long). I didn't fix those 
> > additional errors.
> > 
> > 3) LARGE_READX and LARGE_WRITEX support
> > 
> > The patch adds LARGE_READX and LARGE_WRITEX support for 
> > SmbFileInputStream, SmbFileOutputStream and SmbRandomAccessFile. This 
> > significantly increases the performance when transferring files from and 
> > to Windows servers.
> > 
> > For example transferring a 183 MB file (using streams):
> > 
> >                 modified 1.2.6   original 1.2.6
> > Download	       23 sec           39 sec
> > Upload	               26 sec           40 sec
> > 
> > Client: Windows XP SP 2, Java 1.4.2_08
> > Server: Windows XP SP 2
> > 
> > The test used a 128k buffer to transfer the data from the InputStream to 
> > the OutputStream.
> > 
> > 
> > Bye,
> > 
> >    Thomas
> > 
> > 

-- 
"Implementing CIFS - the Common Internet FileSystem" ISBN: 013047116X
Samba Team -- http://www.samba.org/     -)-----   Christopher R. Hertel
jCIFS Team -- http://jcifs.samba.org/   -)-----   ubiqx development, uninq.
ubiqx Team -- http://www.ubiqx.org/     -)-----   crh at ubiqx.mn.org
OnLineBook -- http://ubiqx.org/cifs/    -)-----   crh at ubiqx.org


More information about the jcifs mailing list