[BUG] bunzip2 error -5 / short read

Rob Landley rob at landley.net
Sun Oct 6 22:33:00 UTC 2013


On 10/06/2013 08:21:41 AM, Tanguy Pruvot wrote:
> Bonjour,
> 
>   I'm  forwarding  you  a  bug  report from Cyanogenmod project, i can
>   reproduce it on the current 1.22 master on my PC too.
> 
>   https://jira.cyanogenmod.org/browse/CYAN-1896
> 
>   If somebody could help us on that, thanks, currently investigating  
> too ..

I wrote the bunzip2 code in busybox way back when, and it theoretically  
still the same stuff toybox is using, so let's see...

   $ ./toybox bzcat stage3-armv7a_hardfp-20130209.tar.bz2 > stage3.tar
   bzcat: bad data

Interesting. And the ubuntu version works. Ok, stick a printf in there  
to see which block is failing... block 118.

     /* When we hit the first non-run symbol after a run, we now know
        how many times to repeat the last literal, so append that many
        copies to our buffer of decoded symbols (dbuf) now. (The last
        literal used is the one at the head of the mtfSymbol array.) */
     if (runPos) {
       runPos = 0;
       if (dbufCount+hh >= bd->dbufSize) return RETVAL_DATA_ERROR;

Which is where it's returning, because:
  dbufCount=899973, hh=27, bd->dbufSize=900000

So the run exactly filled up the buffer, but the run had to be  
terminated by a non-run symbol which _also_ has to go in the buffer?  
Ah, not if it's the terminating symbol, then it'd break on the next  
line. So filling up the buffer exactly with a run is ok.

So the fix is to turn the >= into a =. I just fixed it in toybox, and  
checked that the decompressed output matches what the original  
implementation does (it does).

Thanks,

Rob


More information about the busybox mailing list