char *data;
{
size_t header_size;
+ ssize_t remain_size;
ssize_t extend_size;
int padding;
unsigned int hcrc;
hdr->size_field_length = 2; /* in bytes */
hdr->header_size = header_size = get_word();
+ /* The data variable has been already read as COMMON_HEADER_SIZE bytes.
+ So we must read the remaining header size without ext-header. */
+ remain_size = header_size - I_LEVEL2_HEADER_SIZE;
+ if (remain_size < 0) {
+ error("Invalid header size (LHarc file ?)");
+ return FALSE;
+ }
if (fread(data + COMMON_HEADER_SIZE,
I_LEVEL2_HEADER_SIZE - COMMON_HEADER_SIZE, 1, fp) == 0) {
error("Invalid header (LHarc file ?)");
return FALSE;
padding = header_size - I_LEVEL2_HEADER_SIZE - extend_size;
- while (padding--) /* padding should be 0 or 1 */
+ /* padding should be 0 or 1 */
+ if (padding != 0 && padding != 1) {
+ error("Invalid header size (padding: %d)", padding);
+ return FALSE;
+ }
+ while (padding--)
hcrc = UPDATE_CRC(hcrc, fgetc(fp));
if (hdr->header_crc != hcrc)
char *data;
{
size_t header_size;
+ ssize_t remain_size;
ssize_t extend_size;
int padding;
unsigned int hcrc;
hdr->crc = get_word();
hdr->extend_type = get_byte();
hdr->header_size = header_size = get_longword();
+ remain_size = header_size - I_LEVEL3_HEADER_SIZE;
+ if (remain_size < 0) {
+ error("Invalid header size (LHarc file ?)");
+ return FALSE;
+ }
extend_size = get_longword();
INITIALIZE_CRC(hcrc);
if (extend_size == -1)
return FALSE;
- padding = header_size - I_LEVEL3_HEADER_SIZE - extend_size;
- while (padding--) /* padding should be 0 */
- hcrc = UPDATE_CRC(hcrc, fgetc(fp));
+ padding = remain_size - extend_size;
+ /* padding should be 0 */
+ if (padding != 0) {
+ error("Invalid header size (padding: %d)", padding);
+ return FALSE;
+ }
if (hdr->header_crc != hcrc)
error("header CRC error");