[squeak-dev] The Trunk: Compression-nice.52.mcz
Tobias Pape
Das.Linux at gmx.de
Fri Mar 31 22:49:55 UTC 2017
\o/
Thanks!
> On 01.04.2017, at 00:30, commits at source.squeak.org wrote:
>
> Nicolas Cellier uploaded a new version of Compression to project The Trunk:
> http://source.squeak.org/trunk/Compression-nice.52.mcz
>
> ==================== Summary ====================
>
> Name: Compression-nice.52
> Author: nice
> Time: 1 April 2017, 12:30:20.191934 am
> UUID: 470505e6-d35d-450a-9804-29b904c5853d
> Ancestors: Compression-ul.51
>
> Correct a bug that can cause ZlibPlugin to read past the zipCollection boundary in DeflateBlock.
>
> If the plugin is disabled, there will be a 'subscript is out of bounds: 65537' in DeflateStream fallback code.
>
> ByteString(Object)>>error:
> ByteString(Object)>>errorSubscriptBounds:
> ByteString(Object)>>at:
> ByteString>>at:
> ByteString>>byteAt:
> GZipWriteStream(DeflateStream)>>updateHashAt:
> GZipWriteStream(DeflateStream)>>insertStringAt:
> GZipWriteStream(DeflateStream)>>deflateBlock:chainLength:goodMatch:
> GZipWriteStream(ZipWriteStream)>>deflateBlock:chainLength:goodMatch:
> GZipWriteStream(DeflateStream)>>deflateBlock
> GZipWriteStream(DeflateStream)>>next:putAll:startingAt:
> GZipWriteStream(DeflateStream)>>nextPutAll:
> ByteString(String)>>zipped
>
> This bug is triggered by some input data, for example if you extract the snapshot.bin file from the zip archive the archive http://source.squeak.org/VMMaker/VMMaker.oscog-nice.794.mcz
>
> We need MinMatch bytes to insert the string following the best match.
> (confirmed by comment near the end of a C version http://git.savannah.gnu.org/cgit/gzip.git/tree/deflate.c)
>
> Since we pass lastIndex-1 to the primitive, and that the longest match can be up to MaxMatch, we are going to read the zipCollection up to:
>
> lastIndex - 1 + MaxMatch - 1 + MinMatch - 1 (0 based)
>
> Thus we must have:
>
> lastIndex - 1 + MaxMatch - 1 + MinMatch - 1 < writeLimit
>
> We have MinMatch = 3, thus the simplification
>
> lastIndex + MaxMatch < writeLimit
>
> Thus the requirement:
>
> lastIndex + MaxMatch + 1 <= writeLimit
>
> =============== Diff against Compression-ul.51 ===============
>
> Item was changed:
> ----- Method: DeflateStream>>deflateBlock (in category 'deflating') -----
> deflateBlock
> "Deflate the current contents of the stream"
> | flushNeeded lastIndex |
> (blockStart == nil) ifTrue:[
> "One time initialization for the first block"
> 1 to: MinMatch-1 do:[:i| self updateHashAt: i].
> blockStart := 0].
>
> [blockPosition < position] whileTrue:[
> + (position + MaxMatch + 1 > writeLimit)
> + ifTrue:[lastIndex := writeLimit - MaxMatch - 1]
> - (position + MaxMatch > writeLimit)
> - ifTrue:[lastIndex := writeLimit - MaxMatch]
> ifFalse:[lastIndex := position].
> flushNeeded := self deflateBlock: lastIndex-1
> chainLength: self hashChainLength
> goodMatch: self goodMatchLength.
> flushNeeded ifTrue:[
> self flushBlock.
> blockStart := blockPosition].
> "Make room for more data"
> self moveContentsToFront].
> !
>
>
More information about the Squeak-dev
mailing list
|