Path: blob/main/archivers/arc/files/patch-arcio.c
16461 views
--- arcio.c.orig 2013-06-27 02:00:19 UTC1+++ arcio.c2@@ -35,6 +35,7 @@ readhdr(hdr, f) /* read a header from an archive */3#endif4char name[FNLEN]; /* filename buffer */5int try = 0;/* retry counter */6+ int hdrlen;7static int first = 1; /* true only on first read */89if (!f) /* if archive didn't open */10@@ -44,7 +45,7 @@ readhdr(hdr, f) /* read a header from an archive */11return 0; /* then signal end of archive */1213if (hdrver != ARCMARK) { /* check archive validity */14- if (warn) {15+ if (arcwarn) {16printf("An entry in %s has a bad header.\n", arcname);17nerrs++;18}19@@ -65,10 +66,10 @@ readhdr(hdr, f) /* read a header from an archive */20if (feof(f) && first)21arcdie("%s is not an archive", arcname);2223- if (changing && warn)24+ if (changing && arcwarn)25arcdie("%s is corrupted -- changes disallowed", arcname);2627- if (warn)28+ if (arcwarn)29printf(" %d bytes skipped.\n", try);3031if (feof(f))32@@ -90,33 +91,40 @@ readhdr(hdr, f) /* read a header from an archive */33printf("I think you need a newer version of ARC.\n");34exit(1);35}36+37/* amount to read depends on header type */38+ if (hdrver == 1) {39+ hdrlen = 23; /* old style is shorter */40+ } else {41+ hdrlen = 27;42+ }4344- if (hdrver == 1) { /* old style is shorter */45- if (fread(hdr, sizeof(struct heads) - sizeof(long int), 1, f) != 1)46- arcdie("%s was truncated", arcname);47- hdrver = 2; /* convert header to new format */48- hdr->length = hdr->size; /* size is same when not49- * packed */50- } else51-#if MSDOS52- if (fread(hdr, sizeof(struct heads), 1, f) != 1)53- arcdie("%s was truncated", arcname);54-#else55- if (fread(dummy, 27, 1, f) != 1)56- arcdie("%s was truncated", arcname);57+ if (fread(dummy, hdrlen, 1, f) != 1)58+ arcdie("%s was truncated", arcname);5960for (i = 0; i < FNLEN; hdr->name[i] = dummy[i], i++);61+ hdr->name[FNLEN - 1] = 0; /* ensure 0 termination */62#if _MTS63(void) atoe(hdr->name, strlen(hdr->name));64#endif65+ if (strchr(hdr->name, CUTOFF) != NULL)66+ arcdie("%s contains illegal filename %s", arcname, hdr->name);67+68for (i = 0, hdr->size=0; i<4; hdr->size<<=8, hdr->size += dummy[16-i], i++);69hdr->date = (short) ((dummy[18] << 8) + dummy[17]);70hdr->time = (short) ((dummy[20] << 8) + dummy[19]);71hdr->crc = (short) ((dummy[22] << 8) + dummy[21]);72- for (i = 0, hdr->length=0; i<4; hdr->length<<=8, hdr->length += dummy[26-i], i++);73-#endif7475+ if (hdrver == 1) {76+ hdrver = 2; /* convert header to new format */77+ hdr->length = hdr->size; /* size is same when not78+ * packed */79+ } else {80+ for (i = 0, hdr->length=0; i<4; hdr->length<<=8, hdr->length += dummy[26-i], i++);81+ }82+83+ if (hdr->size < 0)84+ arcdie("Invalid header in archive %s", arcname);85if (hdr->date > olddate86|| (hdr->date == olddate && hdr->time > oldtime)) {87olddate = hdr->date;888990