Re: woody bf gunzip bugs
On Thu, Apr 19, 2001 at 12:07:03AM +1000, Anthony Towns wrote:
> On Wed, Apr 18, 2001 at 08:05:35PM +1000, Glenn McGrath wrote:
> > I recently made some big changes to gunzip, looks like i didnt test it
> > well enough.
>
> *gag*
>
> > I will look into it now, i doubt #3 is anything serious, as ive been
> > using it a lot with dpkg, dpkg-deb, probably some error messages or
> > something are getting mixed up in the output stream.
>
> There are at least two bugs: one is that fseek() doesn't work on
> unseekable file handles, like stdin and stdout; the other (that you're
> fortunately avoiding) is that the order of evaluation in C of the oeprands
> of arithmetic operators like "+" is undefined. That is, code like:
>
> int chars_printed = printf("foo") + printf("bar");
>
> will usually equal 6, but you could get "foobar" printed, "barfoo"
> printed, or even conceivably something completely different.
>
> A rough patch which seems to get it working again is:
>
> /* Ignore time stamp(4), extra flags(1), OS type(1) */
> - fseek(in_file, 6, SEEK_CUR);
> + { int i = 0; while (i < 6) { fgetc(in_file); i++; } }
> + /* fseek(in_file, 6, SEEK_CUR); -- you can't seek on stdin */
>
> if ((flags & extra_field) != 0) {
> - fseek(in_file, (size_t) fgetc(in_file) + ((size_t)fgetc(in_file)
> << 8), SEEK_CUR);
> + int i;
> + i = fgetc(in_file);
> + i += fgetc(in_file) << 8;
> + while (i-- > 0) fgetc(in_file);
> + /* fseek(in_file, (size_t) fgetc(in_file) + ((size_t)fgetc(in_fi
> le) << 8), SEEK_CUR);
> + * -- you can't seek on stdin, and the order of function calls
> + * in the above isn't guaranteed */
> }
>
> Dicking around with gzip code is just asking for obscure bugs to bite in
> you in the bum, though...
I've committed a variation on this to CVS. I'll go bug Erik to
make a new release...
Matt
Reply to: