int gunzip_test_header (void) { unsigned char buf[10]; /* "compressed_file" is already reset to zero by this point */ /* * This checks if the file is gzipped. If a problem occurs here * (other than a real error with the disk) then we don't think it * is a compressed file, and simply mark it as such. */ if (no_decompression || grub_read (buf, 10) != 10 || ((*((unsigned short *) buf) != GZIP_HDR_LE) && (*((unsigned short *) buf) != OLD_GZIP_HDR_LE))) { filepos = 0; return ! errnum; } /* * This does consistency checking on the header data. If a * problem occurs from here on, then we have corrupt or otherwise * bad data, and the error should be reported to the user. */ if (buf[2] != DEFLATED || (buf[3] & UNSUPP_FLAGS) || ((buf[3] & EXTRA_FIELD) && (grub_read (buf, 2) != 2 || bad_field (*((unsigned short *) buf)))) || ((buf[3] & ORIG_NAME) && bad_field (-1)) || ((buf[3] & COMMENT) && bad_field (-1))) { if (! errnum) errnum = ERR_BAD_GZIP_HEADER; return 0; } gzip_data_offset = filepos; filepos = filemax - 8; if (grub_read (buf, 8) != 8) { if (! errnum) errnum = ERR_BAD_GZIP_HEADER; return 0; } gzip_crc = *((unsigned long *) buf); gzip_fsmax = gzip_filemax = *((unsigned long *) (buf + 4)); initialize_tables (); compressed_file = 1; gunzip_swap_values (); /* * Now "gzip_*" values refer to the compressed data. */ filepos = 0; return 1; }
int gunzip_test_header (void) { unsigned char buf[10]; /* "compressed_file" is already reset to zero by this point */ /* * This checks if the file is gzipped. If a problem occurs here * (other than a real error with the disk) then we don't think it * is a compressed file, and simply mark it as such. */ if (no_decompression || grub_read (buf, 10) != 10 || ((*((unsigned short *) buf) != GZIP_HDR_LE) && (*((unsigned short *) buf) != OLD_GZIP_HDR_LE))) { filepos = 0; return ! errnum; } /* * This does consistency checking on the header data. If a * problem occurs from here on, then we have corrupt or otherwise * bad data, and the error should be reported to the user. */ if (buf[2] != DEFLATED || (buf[3] & UNSUPP_FLAGS) || ((buf[3] & EXTRA_FIELD) && (grub_read (buf, 2) != 2 || bad_field (*((unsigned short *) buf)))) || ((buf[3] & ORIG_NAME) && bad_field (-1)) || ((buf[3] & COMMENT) && bad_field (-1))) { if (! errnum) errnum = ERR_BAD_GZIP_HEADER; return 0; } gzip_data_offset = filepos; /* We could read the last 8 bytes of the file to get the uncompressed * size. Doing so under tftp would cause the file to be downloaded * twice, which can be problem with large files. So we set it to * MAXINT and correct it later when we get to the end of the file * in get_byte(). */ gzip_fsmax = gzip_filemax = MAXINT; initialize_tables (); compressed_file = 1; gunzip_swap_values (); /* * Now "gzip_*" values refer to the compressed data. */ filepos = 0; crc = (ulg)0xffffffffUL; return 1; }