Path: blob/main/archivers/lha/files/patch-header.c
16147 views
--- src/header.c.orig 2000-10-05 17:36:03 UTC1+++ src/header.c2@@ -320,8 +320,8 @@ generic_to_unix_stamp(t)3dostm.tm_min = t >> 5 & 0x3f;4dostm.tm_hour = t >> 11 & 0x1f;5dostm.tm_mday = t >> 16 & 0x1f;6- dostm.tm_mon = (t >> 16 + 5 & 0x0f) - 1; /* 0..11 */7- dostm.tm_year = (t >> 16 + 9 & 0x7f) + 80;8+ dostm.tm_mon = (t >> (16 + 5) & 0x0f) - 1; /* 0..11 */9+ dostm.tm_year = (t >> (16 + 9) & 0x7f) + 80;10#if 011dostm.tm_isdst = 0; /* correct? */12#endif13@@ -538,6 +538,10 @@ get_header(fp, hdr)14/*15* filename16*/17+ if (header_size >= 256) {18+ fprintf(stderr, "Possible buffer overflow hack attack, type #1\n");19+ exit(109);20+ }21for (i = 0; i < header_size - 3; i++)22hdr->name[i] = (char) get_byte();23hdr->name[header_size - 3] = '\0';24@@ -547,6 +551,10 @@ get_header(fp, hdr)25/*26* directory27*/28+ if (header_size >= FILENAME_LENGTH) {29+ fprintf(stderr, "Possible buffer overflow hack attack, type #2\n");30+ exit(110);31+ }32for (i = 0; i < header_size - 3; i++)33dirname[i] = (char) get_byte();34dirname[header_size - 3] = '\0';35@@ -648,8 +656,16 @@ get_header(fp, hdr)36}3738if (dir_length) {39+ if ((dir_length + name_length) >= sizeof(dirname)) {40+ fprintf(stderr, "Insufficient buffer size\n");41+ exit(112);42+ }43strcat(dirname, hdr->name);44- strcpy(hdr->name, dirname);45+ if ((dir_length + name_length) >= sizeof(hdr->name)) {46+ fprintf(stderr, "Insufficient buffer size\n");47+ exit(112);48+ }49+ strncpy(hdr->name, dirname, sizeof(hdr->name));50name_length += dir_length;51}5253@@ -754,7 +770,7 @@ write_header(nafp, hdr)5455convdelim(hdr->name, DELIM2);56if (hdr->header_level != HEADER_LEVEL2) {57- if (p = (char *) rindex(hdr->name, DELIM2))58+ if ((p = (char *) rindex(hdr->name, DELIM2)))59name_length = strlen(++p);60else61name_length = strlen(hdr->name);62@@ -812,7 +828,7 @@ write_header(nafp, hdr)63put_word(hdr->unix_gid);64put_word(hdr->unix_uid);6566- if (p = (char *) rindex(hdr->name, DELIM2)) {67+ if ((p = (char *) rindex(hdr->name, DELIM2))) {68int i;6970name_length = p - hdr->name + 1;71@@ -838,7 +854,7 @@ write_header(nafp, hdr)72data[I_HEADER_CHECKSUM] = calc_sum(data + I_METHOD, header_size);73} else { /* header level 2 */74int i;75- if (p = (char *) rindex(hdr->name, DELIM2))76+ if ((p = (char *) rindex(hdr->name, DELIM2)))77name_length = strlen(++p);78else {79p = hdr->name;808182