libkmod-file: gracefully handle errors from zlib

zlib won't necessarily set the system errno, and this is particularly
evident on corrupted data (which results in a double free). Use zlib's
gzerror to detect the failure, returning a generic EINVAL when zlib
doesn't provide us with an errno.
This commit is contained in:
Dave Reisner 2012-05-07 19:41:41 -04:00 committed by Lucas De Marchi
parent 4321590770
commit c7d5a60d3d

View File

@ -199,7 +199,13 @@ static int load_zlib(struct kmod_file *file)
if (r == 0)
break;
else if (r < 0) {
err = -errno;
int gzerr;
const char *gz_errmsg = gzerror(file->gzf, &gzerr);
ERR(file->ctx, "gzip: %s\n", gz_errmsg);
/* gzip might not set errno here */
err = gzerr == Z_ERRNO ? -errno : -EINVAL;
goto error;
}
did += r;