Fixed data corruption in InputStreams returned by FTLDat

This commit is contained in:
Vhati 2013-09-06 14:37:51 -04:00
parent 97c54d26e3
commit 0bd9d9e9b9
2 changed files with 24 additions and 5 deletions

View file

@ -62,8 +62,9 @@ public class FileChannelRegionInputStream extends InputStream {
}
}
// Do an absolute get() from the buffer.
int result = buf.get( (int)(intraPos - bufOffset) );
// Do an absolute get() from the buffer,
// and interpret the byte as if it were unsigned.
int result = (int)(buf.get( (int)(intraPos - bufOffset) ) & 0xff);
intraPos++;
return result;
}
@ -78,14 +79,16 @@ public class FileChannelRegionInputStream extends InputStream {
int bytesTotal = Math.min( bLen, (int)(regionLength - intraPos) );
int bytesRemaining = bytesTotal;
int bytesRead = 0;
if ( intraPos >= bufOffset || intraPos < bufOffset+bufLength ) {
if ( intraPos >= bufOffset && intraPos < bufOffset+bufLength ) {
// Read part of the current buffer, possibly until the end.
buf.position( (int)(intraPos - bufOffset) );
int bufTodo = Math.min( bytesRemaining, bufLength - (int)(intraPos - bufOffset) );
buf.get( b, bOff, bufTodo );
bytesRemaining -= bufTodo;
bytesRead += bufTodo;
intraPos += bufTodo;
}
@ -105,11 +108,25 @@ public class FileChannelRegionInputStream extends InputStream {
buf.position( 0 );
int bufTodo = Math.min( bytesRemaining, bufLength );
buf.get( b, bOff, bufTodo );
buf.get( b, bOff + bytesRead, bufTodo );
bytesRemaining -= bufTodo;
bytesRead += bufTodo;
intraPos += bufTodo;
}
return ( bytesTotal - bytesRemaining ); // Return number of bytes read.
return bytesRead;
}
@Override
public long skip( long n ) throws IOException {
if ( !channel.isOpen() ) throw new ClosedChannelException();
if ( intraPos >= regionLength ) return -1;
if ( intraPos + n <= regionLength ) {
n = regionLength - intraPos;
}
intraPos += n;
return n;
}
}