scottmac Mon May 4 20:52:44 2009 UTC Modified files: /php-src/ext/fileinfo/libmagic apprentice.c apptype.c cdf.c cdf.h compress.c file.h funcs.c magic.c patchlevel.h readcdf.c softmagic.c Log: Update libmagic to 5.02
http://cvs.php.net/viewvc.cgi/php-src/ext/fileinfo/libmagic/apprentice.c?r1=1.21&r2=1.22&diff_format=u Index: php-src/ext/fileinfo/libmagic/apprentice.c diff -u php-src/ext/fileinfo/libmagic/apprentice.c:1.21 php-src/ext/fileinfo/libmagic/apprentice.c:1.22 --- php-src/ext/fileinfo/libmagic/apprentice.c:1.21 Sun Mar 15 23:02:34 2009 +++ php-src/ext/fileinfo/libmagic/apprentice.c Mon May 4 20:52:43 2009 @@ -98,8 +98,8 @@ private int getvalue(struct magic_set *ms, struct magic *, const char **, int); private int hextoint(int); -private const char *getstr(struct magic_set *, const char *, char *, int, - int *, int); +private const char *getstr(struct magic_set *, struct magic *, const char *, + int); private int parse(struct magic_set *, struct magic_entry **, uint32_t *, const char *, size_t, int); private void eatsize(const char **); @@ -1670,8 +1670,7 @@ * string is not one character long */ file_magwarn(ms, "Printf format `%c' is not valid for type " - "`%s' in description `%s'", - ptr && *ptr ? *ptr : '?', + "`%s' in description `%s'", *ptr ? *ptr : '?', file_names[m->type], m->desc); return -1; } @@ -1696,8 +1695,6 @@ private int getvalue(struct magic_set *ms, struct magic *m, const char **p, int action) { - int slen; - switch (m->type) { case FILE_BESTRING16: case FILE_LESTRING16: @@ -1705,16 +1702,13 @@ case FILE_PSTRING: case FILE_REGEX: case FILE_SEARCH: - *p = getstr(ms, *p, m->value.s, sizeof(m->value.s), &slen, action); + *p = getstr(ms, m, *p, action == FILE_COMPILE); if (*p == NULL) { if (ms->flags & MAGIC_CHECK) file_magwarn(ms, "cannot get string from `%s'", m->value.s); return -1; } - m->vallen = slen; - if (m->type == FILE_PSTRING) - m->vallen++; return 0; case FILE_FLOAT: case FILE_BEFLOAT: @@ -1753,13 +1747,15 @@ /* * Convert a string containing C character escapes. Stop at an unescaped * space or tab. - * Copy the converted version to "p", returning its length in *slen. - * Return updated scan pointer as function result. + * Copy the converted version to "m->value.s", and the length in m->vallen. + * Return updated scan pointer as function result. Warn if set. */ private const char * -getstr(struct magic_set *ms, const char *s, char *p, int plen, int *slen, int action) +getstr(struct magic_set *ms, struct magic *m, const char *s, int warn) { const char *origs = s; + char *p = m->value.s; + size_t plen = sizeof(m->value.s); char *origp = p; char *pmax = p + plen - 1; int c; @@ -1776,25 +1772,33 @@ switch(c = *s++) { case '\0': - if (action == FILE_COMPILE) + if (warn) file_magwarn(ms, "incomplete escape"); goto out; case '\t': - if (action == FILE_COMPILE) { + if (warn) { file_magwarn(ms, "escaped tab found, use \\t instead"); - action++; + warn = 0; /* already did */ } /*FALLTHROUGH*/ default: - if (action == FILE_COMPILE) { - if (isprint((unsigned char)c)) - file_magwarn(ms, - "no need to escape `%c'", c); - else - file_magwarn(ms, - "unknown escape sequence: \\%03o", c); + if (warn) { + if (isprint((unsigned char)c)) { + /* Allow escaping of + * ``relations'' */ + if (strchr("<>&^=!", c) + == NULL) { + file_magwarn(ms, "no " + "need to escape " + "`%c'", c); + } + } else { + file_magwarn(ms, + "unknown escape sequence: " + "\\%03o", c); + } } /*FALLTHROUGH*/ /* space, perhaps force people to use \040? */ @@ -1893,7 +1897,9 @@ } out: *p = '\0'; - *slen = p - origp; + m->vallen = p - origp; + if (m->type == FILE_PSTRING) + m->vallen++; return s; } @@ -2080,7 +2086,7 @@ version = ptr[1]; if (version != VERSIONNO) { - file_error(ms, 0, "File %d.%d supports only %d version magic " + file_error(ms, 0, "File %d.%d supports only version %d magic " "files. `%s' is version %d", FILE_VERSION_MAJOR, patchlevel, VERSIONNO, dbname, version); goto error1; http://cvs.php.net/viewvc.cgi/php-src/ext/fileinfo/libmagic/apptype.c?r1=1.2&r2=1.3&diff_format=u Index: php-src/ext/fileinfo/libmagic/apptype.c diff -u php-src/ext/fileinfo/libmagic/apptype.c:1.2 php-src/ext/fileinfo/libmagic/apptype.c:1.3 --- php-src/ext/fileinfo/libmagic/apptype.c:1.2 Sun Mar 15 23:02:34 2009 +++ php-src/ext/fileinfo/libmagic/apptype.c Mon May 4 20:52:43 2009 @@ -77,7 +77,7 @@ } (void)fclose(fp); } - rc = DosQueryAppType(path, &type); + rc = DosQueryAppType((unsigned char *)path, &type); if (fn == NULL) { unlink(path); http://cvs.php.net/viewvc.cgi/php-src/ext/fileinfo/libmagic/cdf.c?r1=1.3&r2=1.4&diff_format=u Index: php-src/ext/fileinfo/libmagic/cdf.c diff -u php-src/ext/fileinfo/libmagic/cdf.c:1.3 php-src/ext/fileinfo/libmagic/cdf.c:1.4 --- php-src/ext/fileinfo/libmagic/cdf.c:1.3 Mon Mar 16 15:02:44 2009 +++ php-src/ext/fileinfo/libmagic/cdf.c Mon May 4 20:52:43 2009 @@ -62,7 +62,7 @@ #endif #ifdef CDF_DEBUG -#define DPRINTF(a) printf a +#define DPRINTF(a) printf a, fflush(stdout) #else #define DPRINTF(a) #endif @@ -233,34 +233,73 @@ CDF_UNPACK(d->d_unused0); } +static ssize_t +cdf_read(const cdf_info_t *info, off_t off, void *buf, size_t len) +{ + size_t siz = (size_t)off + len; + + if ((off_t)(off + len) != (off_t)siz) { + errno = EINVAL; + return -1; + } + + if (info->i_buf != NULL && info->i_len >= siz) { + (void)memcpy(buf, &info->i_buf[off], len); + return (ssize_t)len; + } + + if (info->i_fd == -1) + return -1; + + if (lseek(info->i_fd, off, SEEK_SET) == (off_t)-1) + return -1; + + if (read(info->i_fd, buf, len) != (ssize_t)len) + return -1; + + return (ssize_t)len; +} + + int -cdf_read_header(int fd, cdf_header_t *h) +cdf_read_header(const cdf_info_t *info, cdf_header_t *h) { char buf[512]; + (void)memcpy(cdf_bo.s, "\01\02\03\04", 4); - if (lseek(fd, (off_t)0, SEEK_SET) == (off_t)-1) - return -1; - if (read(fd, buf, sizeof(buf)) != sizeof(buf)) + if (cdf_read(info, (off_t)0, buf, sizeof(buf)) == -1) return -1; cdf_unpack_header(h, buf); cdf_swap_header(h); if (h->h_magic != CDF_MAGIC) { - DPRINTF(("Bad magic 0x%x != 0x$x\n", h->h_magic, CDF_MAGIC)); - errno = EFTYPE; - return -1; + DPRINTF(("Bad magic 0x%llx != 0x%llx\n", + (unsigned long long)h->h_magic, + (unsigned long long)CDF_MAGIC)); + goto out; + } + if (h->h_sec_size_p2 > 20) { + DPRINTF(("Bad sector size 0x%u\n", h->h_sec_size_p2)); + goto out; + } + if (h->h_short_sec_size_p2 > 20) { + DPRINTF(("Bad short sector size 0x%u\n", + h->h_short_sec_size_p2)); + goto out; } return 0; +out: + errno = EFTYPE; + return -1; } ssize_t -cdf_read_sector(int fd, void *buf, size_t offs, size_t len, +cdf_read_sector(const cdf_info_t *info, void *buf, size_t offs, size_t len, const cdf_header_t *h, cdf_secid_t id) { assert((size_t)CDF_SEC_SIZE(h) == len); - if (lseek(fd, (off_t)CDF_SEC_POS(h, id), SEEK_SET) == (off_t)-1) - return -1; - return read(fd, ((char *)buf) + offs, len); + return cdf_read(info, (off_t)CDF_SEC_POS(h, id), + ((char *)buf) + offs, len); } ssize_t @@ -277,24 +316,35 @@ * Read the sector allocation table. */ int -cdf_read_sat(int fd, cdf_header_t *h, cdf_sat_t *sat) +cdf_read_sat(const cdf_info_t *info, cdf_header_t *h, cdf_sat_t *sat) { size_t i, j, k; size_t ss = CDF_SEC_SIZE(h); - cdf_secid_t *msa, mid; + cdf_secid_t *msa, mid, sec; + size_t nsatpersec = (ss / sizeof(mid)) - 1; for (i = 0; i < __arraycount(h->h_master_sat); i++) if (h->h_master_sat[i] == CDF_SECID_FREE) break; - sat->sat_len = (h->h_num_sectors_in_master_sat + i); +#define CDF_SEC_LIMIT (UINT32_MAX / (4 * ss)) + if (h->h_num_sectors_in_master_sat > CDF_SEC_LIMIT || + i > CDF_SEC_LIMIT / nsatpersec) { + DPRINTF(("Number of sectors in master SAT too big %u %zu\n", + h->h_num_sectors_in_master_sat, i)); + errno = EFTYPE; + return -1; + } + + sat->sat_len = h->h_num_sectors_in_master_sat + i * nsatpersec; + DPRINTF(("sat_len = %zu ss = %zu\n", sat->sat_len, ss)); if ((sat->sat_tab = calloc(sat->sat_len, ss)) == NULL) return -1; for (i = 0; i < __arraycount(h->h_master_sat); i++) { if (h->h_master_sat[i] < 0) break; - if (cdf_read_sector(fd, sat->sat_tab, ss * i, ss, h, + if (cdf_read_sector(info, sat->sat_tab, ss * i, ss, h, h->h_master_sat[i]) != (ssize_t)ss) { DPRINTF(("Reading sector %d", h->h_master_sat[i])); goto out1; @@ -311,18 +361,30 @@ errno = EFTYPE; goto out2; } - if (cdf_read_sector(fd, msa, 0, ss, h, mid) != (ssize_t)ss) { + if (cdf_read_sector(info, msa, 0, ss, h, mid) != (ssize_t)ss) { DPRINTF(("Reading master sector %d", mid)); goto out2; } - for (k = 0; k < (ss / sizeof(mid)) - 1; k++, i++) - if (cdf_read_sector(fd, sat->sat_tab, ss * i, ss, h, - CDF_TOLE4(msa[k])) != (ssize_t)ss) { + for (k = 0; k < nsatpersec; k++, i++) { + sec = CDF_TOLE4(msa[k]); + if (sec < 0) { + sat->sat_len = i; + break; + } + if (i >= sat->sat_len) { + DPRINTF(("Out of bounds reading MSA %u >= %u", + i, sat->sat_len)); + errno = EFTYPE; + goto out2; + } + if (cdf_read_sector(info, sat->sat_tab, ss * i, ss, h, + sec) != (ssize_t)ss) { DPRINTF(("Reading sector %d", CDF_TOLE4(msa[k]))); goto out2; } - mid = CDF_TOLE4(msa[(ss / sizeof(mid)) - 1]); + } + mid = CDF_TOLE4(msa[nsatpersec]); } free(msa); return 0; @@ -334,11 +396,10 @@ } size_t -cdf_count_chain(const cdf_header_t *h, const cdf_sat_t *sat, - cdf_secid_t sid) +cdf_count_chain(const cdf_sat_t *sat, cdf_secid_t sid, size_t size) { - size_t i, j, s = CDF_SEC_SIZE(h) / sizeof(cdf_secid_t); - cdf_secid_t maxsector = (cdf_secid_t)(sat->sat_len * s); + size_t i, j; + cdf_secid_t maxsector = (cdf_secid_t)(sat->sat_len * size); DPRINTF(("Chain:")); for (j = i = 0; sid >= 0; i++, j++) { @@ -360,12 +421,12 @@ } int -cdf_read_long_sector_chain(int fd, const cdf_header_t *h, const cdf_sat_t *sat, - cdf_secid_t sid, size_t len, cdf_stream_t *scn) +cdf_read_long_sector_chain(const cdf_info_t *info, const cdf_header_t *h, + const cdf_sat_t *sat, cdf_secid_t sid, size_t len, cdf_stream_t *scn) { size_t ss = CDF_SEC_SIZE(h), i, j; ssize_t nr; - scn->sst_len = cdf_count_chain(h, sat, sid); + scn->sst_len = cdf_count_chain(sat, sid, ss); scn->sst_dirlen = len; if (scn->sst_len == (size_t)-1) @@ -376,7 +437,18 @@ return -1; for (j = i = 0; sid >= 0; i++, j++) { - if ((nr = cdf_read_sector(fd, scn->sst_tab, i * ss, ss, h, + if (j >= CDF_LOOP_LIMIT) { + DPRINTF(("Read long sector chain loop limit")); + errno = EFTYPE; + goto out; + } + if (i >= scn->sst_len) { + DPRINTF(("Out of bounds reading long sector chain " + "%u > %u\n", i, scn->sst_len)); + errno = EFTYPE; + goto out; + } + if ((nr = cdf_read_sector(info, scn->sst_tab, i * ss, ss, h, sid)) != (ssize_t)ss) { if (i == scn->sst_len - 1 && nr > 0) { /* Last sector might be truncated */ @@ -386,11 +458,6 @@ goto out; } sid = CDF_TOLE4(sat->sat_tab[sid]); - if (j >= CDF_LOOP_LIMIT) { - DPRINTF(("Read long sector chain loop limit")); - errno = EFTYPE; - goto out; - } } return 0; out: @@ -404,7 +471,7 @@ cdf_secid_t sid, size_t len, cdf_stream_t *scn) { size_t ss = CDF_SHORT_SEC_SIZE(h), i, j; - scn->sst_len = cdf_count_chain(h, ssat, sid); + scn->sst_len = cdf_count_chain(ssat, sid, CDF_SEC_SIZE(h)); scn->sst_dirlen = len; if (scn->sst_len == (size_t)-1) @@ -420,6 +487,12 @@ errno = EFTYPE; goto out; } + if (i >= scn->sst_len) { + DPRINTF(("Out of bounds reading short sector chain " + "%u > %u\n", i, scn->sst_len)); + errno = EFTYPE; + goto out; + } if (cdf_read_short_sector(sst, scn->sst_tab, i * ss, ss, h, sid) != (ssize_t)ss) { DPRINTF(("Reading short sector chain %d", sid)); @@ -434,8 +507,8 @@ } int -cdf_read_sector_chain(int fd, const cdf_header_t *h, const cdf_sat_t *sat, - const cdf_sat_t *ssat, const cdf_stream_t *sst, +cdf_read_sector_chain(const cdf_info_t *info, const cdf_header_t *h, + const cdf_sat_t *sat, const cdf_sat_t *ssat, const cdf_stream_t *sst, cdf_secid_t sid, size_t len, cdf_stream_t *scn) { @@ -443,19 +516,19 @@ return cdf_read_short_sector_chain(h, ssat, sst, sid, len, scn); else - return cdf_read_long_sector_chain(fd, h, sat, sid, len, scn); + return cdf_read_long_sector_chain(info, h, sat, sid, len, scn); } int -cdf_read_dir(int fd, const cdf_header_t *h, const cdf_sat_t *sat, - cdf_dir_t *dir) +cdf_read_dir(const cdf_info_t *info, const cdf_header_t *h, + const cdf_sat_t *sat, cdf_dir_t *dir) { size_t i, j; size_t ss = CDF_SEC_SIZE(h), ns, nd; char *buf; cdf_secid_t sid = h->h_secid_first_directory; - ns = cdf_count_chain(h, sat, sid); + ns = cdf_count_chain(sat, sid, ss); if (ns == (size_t)-1) return -1; @@ -477,7 +550,7 @@ errno = EFTYPE; goto out; } - if (cdf_read_sector(fd, buf, 0, ss, h, sid) != (ssize_t)ss) { + if (cdf_read_sector(info, buf, 0, ss, h, sid) != (ssize_t)ss) { DPRINTF(("Reading directory sector %d", sid)); goto out; } @@ -500,14 +573,14 @@ int -cdf_read_ssat(int fd, const cdf_header_t *h, const cdf_sat_t *sat, - cdf_sat_t *ssat) +cdf_read_ssat(const cdf_info_t *info, const cdf_header_t *h, + const cdf_sat_t *sat, cdf_sat_t *ssat) { size_t i, j; size_t ss = CDF_SEC_SIZE(h); cdf_secid_t sid = h->h_secid_first_sector_in_short_sat; - ssat->sat_len = cdf_count_chain(h, sat, sid); + ssat->sat_len = cdf_count_chain(sat, sid, CDF_SEC_SIZE(h)); if (ssat->sat_len == (size_t)-1) return -1; @@ -521,7 +594,13 @@ errno = EFTYPE; goto out; } - if (cdf_read_sector(fd, ssat->sat_tab, i * ss, ss, h, sid) != + if (i >= ssat->sat_len) { + DPRINTF(("Out of bounds reading short sector chain " + "%u > %u\n", i, ssat->sat_len)); + errno = EFTYPE; + goto out; + } + if (cdf_read_sector(info, ssat->sat_tab, i * ss, ss, h, sid) != (ssize_t)ss) { DPRINTF(("Reading short sat sector %d", sid)); goto out; @@ -535,8 +614,8 @@ } int -cdf_read_short_stream(int fd, const cdf_header_t *h, const cdf_sat_t *sat, - const cdf_dir_t *dir, cdf_stream_t *scn) +cdf_read_short_stream(const cdf_info_t *info, const cdf_header_t *h, + const cdf_sat_t *sat, const cdf_dir_t *dir, cdf_stream_t *scn) { size_t i; const cdf_directory_t *d; @@ -545,10 +624,11 @@ if (dir->dir_tab[i].d_type == CDF_DIR_TYPE_ROOT_STORAGE) break; + /* If the it is not there, just fake it; some docs don't have it */ if (i == dir->dir_len) { - DPRINTF(("Cannot find root storage node\n")); - errno = EFTYPE; - return -1; + scn->sst_tab = NULL; + scn->sst_len = 0; + return 0; } d = &dir->dir_tab[i]; @@ -559,7 +639,7 @@ return 0; } - return cdf_read_long_sector_chain(fd, h, sat, + return cdf_read_long_sector_chain(info, h, sat, d->d_stream_first_sector, d->d_size, scn); } @@ -573,7 +653,7 @@ } int -cdf_read_summary_info(int fd, const cdf_header_t *h, +cdf_read_summary_info(const cdf_info_t *info, const cdf_header_t *h, const cdf_sat_t *sat, const cdf_sat_t *ssat, const cdf_stream_t *sst, const cdf_dir_t *dir, cdf_stream_t *scn) { @@ -593,7 +673,7 @@ return -1; } d = &dir->dir_tab[i]; - return cdf_read_sector_chain(fd, h, sat, ssat, sst, + return cdf_read_sector_chain(info, h, sat, ssat, sst, d->d_stream_first_sector, d->d_size, scn); } @@ -616,9 +696,13 @@ shp = (const void *)((const char *)sst->sst_tab + offs); sh.sh_len = CDF_TOLE4(shp->sh_len); sh.sh_properties = CDF_TOLE4(shp->sh_properties); - DPRINTF(("section len: %d properties %d\n", sh.sh_len, - sh.sh_properties)); +#define CDF_PROP_LIM (UINT32_MAX / (4 * sizeof(*inp))) + if (sh.sh_properties > CDF_PROP_LIM) + goto out; + DPRINTF(("section len: %u properties %u\n", sh.sh_len, sh.sh_properties)); if (*maxcount) { + if (*maxcount > CDF_PROP_LIM) + goto out; *maxcount += sh.sh_properties; inp = realloc(*info, *maxcount * sizeof(*inp)); } else { @@ -689,6 +773,9 @@ case CDF_LENGTH32_STRING: if (nelements > 1) { size_t nelem = inp - *info; + if (*maxcount > CDF_PROP_LIM + || nelements > CDF_PROP_LIM) + goto out; *maxcount += nelements; inp = realloc(*info, *maxcount * sizeof(*inp)); if (inp == NULL) @@ -854,7 +941,7 @@ { size_t i; -#define DUMP(a, b) printf("%40.40s = " a "\n", # b, h->h_ ## b) +#define DUMP(a, b) (void)fprintf(stderr, "%40.40s = " a "\n", # b, h->h_ ## b) DUMP("%d", revision); DUMP("%d", version); DUMP("0x%x", byte_order); @@ -870,24 +957,26 @@ for (i = 0; i < __arraycount(h->h_master_sat); i++) { if (h->h_master_sat[i] == CDF_SECID_FREE) break; - printf("%35.35s[%.3zu] = %d\n", + (void)fprintf(stderr, "%35.35s[%.3zu] = %d\n", "master_sat", i, h->h_master_sat[i]); } } void -cdf_dump_sat(const char *prefix, const cdf_header_t *h, const cdf_sat_t *sat) +cdf_dump_sat(const char *prefix, const cdf_sat_t *sat, size_t size) { - size_t i, j, s = CDF_SEC_SIZE(h) / sizeof(cdf_secid_t); + size_t i, j, s = size / sizeof(cdf_secid_t); for (i = 0; i < sat->sat_len; i++) { - printf("%s[%zu]:\n", prefix, i); + (void)fprintf(stderr, "%s[%zu]:\n%.6d: ", prefix, i, i * s); for (j = 0; j < s; j++) { - printf("%5d, ", CDF_TOLE4(sat->sat_tab[s * i + j])); + (void)fprintf(stderr, "%5d, ", + CDF_TOLE4(sat->sat_tab[s * i + j])); if ((j + 1) % 10 == 0) - printf("\n"); + (void)fprintf(stderr, "\n%.6d: ", + i * s + j + 1); } - printf("\n"); + (void)fprintf(stderr, "\n"); } } @@ -897,17 +986,17 @@ size_t i, j; unsigned char *p = v; char abuf[16]; - printf("%.4x: ", 0); + (void)fprintf(stderr, "%.4x: ", 0); for (i = 0, j = 0; i < len; i++, p++) { - printf("%.2x ", *p); + (void)fprintf(stderr, "%.2x ", *p); abuf[j++] = isprint(*p) ? *p : '.'; if (j == 16) { j = 0; abuf[15] = '\0'; - printf("%s\n%.4x: ", abuf, i + 1); + (void)fprintf(stderr, "%s\n%.4x: ", abuf, i + 1); } } - printf("\n"); + (void)fprintf(stderr, "\n"); } void @@ -919,8 +1008,8 @@ } void -cdf_dump_dir(int fd, const cdf_header_t *h, const cdf_sat_t *sat, - const cdf_sat_t *ssat, const cdf_stream_t *sst, +cdf_dump_dir(const cdf_info_t *info, const cdf_header_t *h, + const cdf_sat_t *sat, const cdf_sat_t *ssat, const cdf_stream_t *sst, const cdf_dir_t *dir) { size_t i, j; @@ -936,29 +1025,30 @@ d = &dir->dir_tab[i]; for (j = 0; j < sizeof(name); j++) name[j] = (char)CDF_TOLE2(d->d_name[j]); - printf("Directory %zu: %s\n", i, name); + (void)fprintf(stderr, "Directory %zu: %s\n", i, name); if (d->d_type < __arraycount(types)) - printf("Type: %s\n", types[d->d_type]); + (void)fprintf(stderr, "Type: %s\n", types[d->d_type]); else - printf("Type: %d\n", d->d_type); - printf("Color: %s\n", d->d_color ? "black" : "red"); - printf("Left child: %d\n", d->d_left_child); - printf("Right child: %d\n", d->d_right_child); - printf("Flags: 0x%x\n", d->d_flags); + (void)fprintf(stderr, "Type: %d\n", d->d_type); + (void)fprintf(stderr, "Color: %s\n", + d->d_color ? "black" : "red"); + (void)fprintf(stderr, "Left child: %d\n", d->d_left_child); + (void)fprintf(stderr, "Right child: %d\n", d->d_right_child); + (void)fprintf(stderr, "Flags: 0x%x\n", d->d_flags); cdf_timestamp_to_timespec(&ts, d->d_created); - printf("Created %s", ctime(&ts.tv_sec)); + (void)fprintf(stderr, "Created %s", ctime(&ts.tv_sec)); cdf_timestamp_to_timespec(&ts, d->d_modified); - printf("Modified %s", ctime(&ts.tv_sec)); - printf("Stream %d\n", d->d_stream_first_sector); - printf("Size %d\n", d->d_size); + (void)fprintf(stderr, "Modified %s", ctime(&ts.tv_sec)); + (void)fprintf(stderr, "Stream %d\n", d->d_stream_first_sector); + (void)fprintf(stderr, "Size %d\n", d->d_size); switch (d->d_type) { case CDF_DIR_TYPE_USER_STORAGE: - printf("Storage: %d\n", d->d_storage); + (void)fprintf(stderr, "Storage: %d\n", d->d_storage); break; case CDF_DIR_TYPE_USER_STREAM: if (sst == NULL) break; - if (cdf_read_sector_chain(fd, h, sat, ssat, sst, + if (cdf_read_sector_chain(info, h, sat, ssat, sst, d->d_stream_first_sector, d->d_size, &scn) == -1) { warn("Can't read stream for %s at %d len %d", name, d->d_stream_first_sector, d->d_size); @@ -984,19 +1074,23 @@ for (i = 0; i < count; i++) { cdf_print_property_name(buf, sizeof(buf), info[i].pi_id); - printf("%zu) %s: ", i, buf); + (void)fprintf(stderr, "%zu) %s: ", i, buf); switch (info[i].pi_type) { case CDF_SIGNED16: - printf("signed 16 [%hd]\n", info[i].pi_s16); + (void)fprintf(stderr, "signed 16 [%hd]\n", + info[i].pi_s16); break; case CDF_SIGNED32: - printf("signed 32 [%d]\n", info[i].pi_s32); + (void)fprintf(stderr, "signed 32 [%d]\n", + info[i].pi_s32); break; case CDF_UNSIGNED32: - printf("unsigned 32 [%u]\n", info[i].pi_u32); + (void)fprintf(stderr, "unsigned 32 [%u]\n", + info[i].pi_u32); break; case CDF_LENGTH32_STRING: - printf("string %u [%.*s]\n", info[i].pi_str.s_len, + (void)fprintf(stderr, "string %u [%.*s]\n", + info[i].pi_str.s_len, info[i].pi_str.s_len, info[i].pi_str.s_buf); break; case CDF_FILETIME: @@ -1007,14 +1101,15 @@ if (tp < 1000000000000000LL) { #endif cdf_print_elapsed_time(buf, sizeof(buf), tp); - printf("timestamp %s\n", buf); + (void)fprintf(stderr, "timestamp %s\n", buf); } else { cdf_timestamp_to_timespec(&ts, tp); - printf("timestamp %s", ctime(&ts.tv_sec)); + (void)fprintf(stderr, "timestamp %s", + ctime(&ts.tv_sec)); } break; case CDF_CLIPBOARD: - printf("CLIPBOARD %u\n", info[i].pi_u32); + (void)fprintf(stderr, "CLIPBOARD %u\n", info[i].pi_u32); break; default: DPRINTF(("Don't know how to deal with %x\n", @@ -1036,13 +1131,13 @@ (void)&h; if (cdf_unpack_summary_info(sst, &ssi, &info, &count) == -1) return; - printf("Endian: %x\n", ssi.si_byte_order); - printf("Os Version %d.%d\n", ssi.si_os_version & 0xff, + (void)fprintf(stderr, "Endian: %x\n", ssi.si_byte_order); + (void)fprintf(stderr, "Os Version %d.%d\n", ssi.si_os_version & 0xff, ssi.si_os_version >> 8); - printf("Os %d\n", ssi.si_os); + (void)fprintf(stderr, "Os %d\n", ssi.si_os); cdf_print_classid(buf, sizeof(buf), &ssi.si_class); - printf("Class %s\n", buf); - printf("Count %d\n", ssi.si_count); + (void)fprintf(stderr, "Class %s\n", buf); + (void)fprintf(stderr, "Count %d\n", ssi.si_count); cdf_dump_property_info(info, count); free(info); } @@ -1053,61 +1148,64 @@ int main(int argc, char *argv[]) { - int fd, i; + int i; cdf_header_t h; cdf_sat_t sat, ssat; cdf_stream_t sst, scn; cdf_dir_t dir; + cdf_info_t info; if (argc < 2) { (void)fprintf(stderr, "Usage: %s <filename>\n", getprogname()); return -1; } + info.i_buf = NULL; + info.i_len = 0; for (i = 1; i < argc; i++) { - if ((fd = open(argv[1], O_RDONLY)) == -1) + if ((info.i_fd = open(argv[1], O_RDONLY)) == -1) err(1, "Cannot open `%s'", argv[1]); - if (cdf_read_header(fd, &h) == -1) + if (cdf_read_header(&info, &h) == -1) err(1, "Cannot read header"); #ifdef CDF_DEBUG cdf_dump_header(&h); #endif - if (cdf_read_sat(fd, &h, &sat) == -1) + if (cdf_read_sat(&info, &h, &sat) == -1) err(1, "Cannot read sat"); #ifdef CDF_DEBUG - cdf_dump_sat("SAT", &h, &sat); + cdf_dump_sat("SAT", &sat, CDF_SEC_SIZE(&h)); #endif - if (cdf_read_ssat(fd, &h, &sat, &ssat) == -1) + if (cdf_read_ssat(&info, &h, &sat, &ssat) == -1) err(1, "Cannot read ssat"); #ifdef CDF_DEBUG - cdf_dump_sat("SSAT", &h, &ssat); + cdf_dump_sat("SSAT", &h, &ssat, CDF_SHORT_SEC_SIZE(&h)); #endif - if (cdf_read_dir(fd, &h, &sat, &dir) == -1) + if (cdf_read_dir(&info, &h, &sat, &dir) == -1) err(1, "Cannot read dir"); - if (cdf_read_short_stream(fd, &h, &sat, &dir, &sst) == -1) + if (cdf_read_short_stream(&info, &h, &sat, &dir, &sst) == -1) err(1, "Cannot read short stream"); #ifdef CDF_DEBUG cdf_dump_stream(&h, &sst); #endif #ifdef CDF_DEBUG - cdf_dump_dir(fd, &h, &sat, &ssat, &sst, &dir); + cdf_dump_dir(&info, &h, &sat, &ssat, &sst, &dir); #endif - if (cdf_read_summary_info(fd, &h, &sat, &ssat, &sst, &dir, + if (cdf_read_summary_info(&inf, &h, &sat, &ssat, &sst, &dir, &scn) == -1) err(1, "Cannot read summary info"); #ifdef CDF_DEBUG cdf_dump_summary_info(&h, &scn); #endif - (void)close(fd); + (void)close(info.i_fd); } return 0; http://cvs.php.net/viewvc.cgi/php-src/ext/fileinfo/libmagic/cdf.h?r1=1.2&r2=1.3&diff_format=u Index: php-src/ext/fileinfo/libmagic/cdf.h diff -u php-src/ext/fileinfo/libmagic/cdf.h:1.2 php-src/ext/fileinfo/libmagic/cdf.h:1.3 --- php-src/ext/fileinfo/libmagic/cdf.h:1.2 Mon Mar 16 15:02:44 2009 +++ php-src/ext/fileinfo/libmagic/cdf.h Mon May 4 20:52:43 2009 @@ -246,38 +246,45 @@ #define CDF_PROPERTY_SECURITY 0x00000013 #define CDF_PROPERTY_LOCALE_ID 0x80000000 +typedef struct { + int i_fd; + const unsigned char *i_buf; + size_t i_len; +} cdf_info_t; + struct timeval; int cdf_timestamp_to_timespec(struct timeval *, cdf_timestamp_t); int cdf_timespec_to_timestamp(cdf_timestamp_t *, const struct timeval *); -int cdf_read_header(int, cdf_header_t *); +int cdf_read_header(const cdf_info_t *, cdf_header_t *); void cdf_swap_header(cdf_header_t *); void cdf_unpack_header(cdf_header_t *, char *); void cdf_swap_dir(cdf_directory_t *); void cdf_unpack_dir(cdf_directory_t *, char *); void cdf_swap_class(cdf_classid_t *); -ssize_t cdf_read_sector(int, void *, size_t, size_t, const cdf_header_t *, - cdf_secid_t); +ssize_t cdf_read_sector(const cdf_info_t *, void *, size_t, size_t, + const cdf_header_t *, cdf_secid_t); ssize_t cdf_read_short_sector(const cdf_stream_t *, void *, size_t, size_t, const cdf_header_t *, cdf_secid_t); -int cdf_read_sat(int, cdf_header_t *, cdf_sat_t *); -size_t cdf_count_chain(const cdf_header_t *, const cdf_sat_t *, - cdf_secid_t); -int cdf_read_long_sector_chain(int, const cdf_header_t *, +int cdf_read_sat(const cdf_info_t *, cdf_header_t *, cdf_sat_t *); +size_t cdf_count_chain(const cdf_sat_t *, cdf_secid_t, size_t); +int cdf_read_long_sector_chain(const cdf_info_t *, const cdf_header_t *, const cdf_sat_t *, cdf_secid_t, size_t, cdf_stream_t *); int cdf_read_short_sector_chain(const cdf_header_t *, const cdf_sat_t *, const cdf_stream_t *, cdf_secid_t, size_t, cdf_stream_t *); -int cdf_read_sector_chain(int, const cdf_header_t *, +int cdf_read_sector_chain(const cdf_info_t *, const cdf_header_t *, const cdf_sat_t *, const cdf_sat_t *, const cdf_stream_t *, cdf_secid_t, size_t, cdf_stream_t *); -int cdf_read_dir(int, const cdf_header_t *, const cdf_sat_t *, cdf_dir_t *); -int cdf_read_ssat(int, const cdf_header_t *, const cdf_sat_t *, cdf_sat_t *); -int cdf_read_short_stream(int, const cdf_header_t *, const cdf_sat_t *, - const cdf_dir_t *, cdf_stream_t *); +int cdf_read_dir(const cdf_info_t *, const cdf_header_t *, const cdf_sat_t *, + cdf_dir_t *); +int cdf_read_ssat(const cdf_info_t *, const cdf_header_t *, const cdf_sat_t *, + cdf_sat_t *); +int cdf_read_short_stream(const cdf_info_t *, const cdf_header_t *, + const cdf_sat_t *, const cdf_dir_t *, cdf_stream_t *); int cdf_read_property_info(const cdf_stream_t *, uint32_t, cdf_property_info_t **, size_t *, size_t *); -int cdf_read_summary_info(int, const cdf_header_t *, const cdf_sat_t *, - const cdf_sat_t *, const cdf_stream_t *, const cdf_dir_t *, - cdf_stream_t *); +int cdf_read_summary_info(const cdf_info_t *, const cdf_header_t *, + const cdf_sat_t *, const cdf_sat_t *, const cdf_stream_t *, + const cdf_dir_t *, cdf_stream_t *); int cdf_unpack_summary_info(const cdf_stream_t *, cdf_summary_info_header_t *, cdf_property_info_t **, size_t *); int cdf_print_classid(char *, size_t, const cdf_classid_t *); @@ -289,10 +296,10 @@ #ifdef CDF_DEBUG void cdf_dump_header(const cdf_header_t *); -void cdf_dump_sat(const char *, const cdf_header_t *, const cdf_sat_t *); +void cdf_dump_sat(const char *, const cdf_sat_t *, size_t); void cdf_dump(void *, size_t); void cdf_dump_stream(const cdf_header_t *, const cdf_stream_t *); -void cdf_dump_dir(int, const cdf_header_t *, const cdf_sat_t *, +void cdf_dump_dir(const cdf_info_t *, const cdf_header_t *, const cdf_sat_t *, const cdf_sat_t *, const cdf_stream_t *, const cdf_dir_t *); void cdf_dump_property_info(const cdf_property_info_t *, size_t); void cdf_dump_summary_info(const cdf_header_t *, const cdf_stream_t *); http://cvs.php.net/viewvc.cgi/php-src/ext/fileinfo/libmagic/compress.c?r1=1.6&r2=1.7&diff_format=u Index: php-src/ext/fileinfo/libmagic/compress.c diff -u php-src/ext/fileinfo/libmagic/compress.c:1.6 php-src/ext/fileinfo/libmagic/compress.c:1.7 --- php-src/ext/fileinfo/libmagic/compress.c:1.6 Sun Mar 15 23:02:34 2009 +++ php-src/ext/fileinfo/libmagic/compress.c Mon May 4 20:52:43 2009 @@ -83,6 +83,7 @@ /* ...only first file examined */ { "BZh", 3, { "bzip2", "-cd", NULL }, 1 }, /* bzip2-ed */ { "LZIP", 4, { "lzip", "-cdq", NULL }, 1 }, + { "\3757zXZ\0",6,{ "xz", "-cd", NULL }, 1 }, /* XZ Utils */ }; private size_t ncompr = sizeof(compr) / sizeof(compr[0]); @@ -491,6 +492,8 @@ #else (void)wait(NULL); #endif + (void) close(fdin[0]); + return n; } } http://cvs.php.net/viewvc.cgi/php-src/ext/fileinfo/libmagic/file.h?r1=1.9&r2=1.10&diff_format=u Index: php-src/ext/fileinfo/libmagic/file.h diff -u php-src/ext/fileinfo/libmagic/file.h:1.9 php-src/ext/fileinfo/libmagic/file.h:1.10 --- php-src/ext/fileinfo/libmagic/file.h:1.9 Mon Mar 16 15:02:44 2009 +++ php-src/ext/fileinfo/libmagic/file.h Mon May 4 20:52:43 2009 @@ -387,7 +387,12 @@ protected const char *file_getbuffer(struct magic_set *); protected ssize_t sread(int, void *, size_t, int); protected int file_check_mem(struct magic_set *, unsigned int); -protected int file_looks_utf8(const unsigned char *, size_t, unichar *, size_t *); +protected int file_looks_utf8(const unsigned char *, size_t, unichar *, + size_t *); +#ifdef __EMX__ +protected int file_os2_apptype(struct magic_set *, const char *, const void *, + size_t); +#endif /* __EMX__ */ extern const char *file_names[]; extern const size_t file_nnames; http://cvs.php.net/viewvc.cgi/php-src/ext/fileinfo/libmagic/funcs.c?r1=1.10&r2=1.11&diff_format=u Index: php-src/ext/fileinfo/libmagic/funcs.c diff -u php-src/ext/fileinfo/libmagic/funcs.c:1.10 php-src/ext/fileinfo/libmagic/funcs.c:1.11 --- php-src/ext/fileinfo/libmagic/funcs.c:1.10 Sun Mar 15 23:02:34 2009 +++ php-src/ext/fileinfo/libmagic/funcs.c Mon May 4 20:52:43 2009 @@ -308,8 +308,12 @@ } if (ms->o.buf) { efree(ms->o.buf); + ms->o.buf = NULL; + } + if (ms->o.pbuf) { + efree(ms->o.pbuf); + ms->o.pbuf = NULL; } - ms->o.buf = NULL; ms->event_flags &= ~EVENT_HAD_ERR; ms->error = -1; return 0; http://cvs.php.net/viewvc.cgi/php-src/ext/fileinfo/libmagic/magic.c?r1=1.8&r2=1.9&diff_format=u Index: php-src/ext/fileinfo/libmagic/magic.c diff -u php-src/ext/fileinfo/libmagic/magic.c:1.8 php-src/ext/fileinfo/libmagic/magic.c:1.9 --- php-src/ext/fileinfo/libmagic/magic.c:1.8 Sun Mar 15 23:02:34 2009 +++ php-src/ext/fileinfo/libmagic/magic.c Mon May 4 20:52:43 2009 @@ -62,10 +62,6 @@ #include <unistd.h> /* for read() */ #endif -#ifdef HAVE_LOCALE_H -#include <locale.h> -#endif - #ifndef PHP_WIN32 # include <netinet/in.h> /* for byte swapping */ #endif @@ -86,12 +82,6 @@ # undef S_IFIFO #endif -#ifdef __EMX__ -private char *apptypeName = NULL; -protected int file_os2_apptype(struct magic_set *ms, const char *fn, - const void *buf, size_t nb); -#endif /* __EMX__ */ - private void free_mlist(struct mlist *); private void close_and_restore(const struct magic_set *, const char *, int, const struct stat *); @@ -308,13 +298,7 @@ } if (!stream) { - if (unreadable_info(ms, sb.st_mode, -#ifdef __CYGWIN - tmp -#else - inname -#endif - ) == -1) + if (unreadable_info(ms, sb.st_mode, inname) == -1) goto done; rv = 0; goto done; http://cvs.php.net/viewvc.cgi/php-src/ext/fileinfo/libmagic/patchlevel.h?r1=1.3&r2=1.4&diff_format=u Index: php-src/ext/fileinfo/libmagic/patchlevel.h diff -u php-src/ext/fileinfo/libmagic/patchlevel.h:1.3 php-src/ext/fileinfo/libmagic/patchlevel.h:1.4 --- php-src/ext/fileinfo/libmagic/patchlevel.h:1.3 Sun Mar 15 23:02:35 2009 +++ php-src/ext/fileinfo/libmagic/patchlevel.h Mon May 4 20:52:43 2009 @@ -1,11 +1,14 @@ #define FILE_VERSION_MAJOR 5 -#define patchlevel 0 +#define patchlevel 2 /* * Patchlevel file for Ian Darwin's MAGIC command. * $File: patchlevel.h,v 1.68 2008/03/22 21:39:43 christos Exp $ * * $Log: patchlevel.h,v $ + * Revision 1.4 2009/05/04 20:52:43 scottmac + * Update libmagic to 5.02 + * * Revision 1.3 2009/03/15 23:02:35 scottmac * Update fileinfo to libmagic 5.00 and remove dependency on dirent.h on Windows * http://cvs.php.net/viewvc.cgi/php-src/ext/fileinfo/libmagic/readcdf.c?r1=1.2&r2=1.3&diff_format=u Index: php-src/ext/fileinfo/libmagic/readcdf.c diff -u php-src/ext/fileinfo/libmagic/readcdf.c:1.2 php-src/ext/fileinfo/libmagic/readcdf.c:1.3 --- php-src/ext/fileinfo/libmagic/readcdf.c:1.2 Mon Mar 16 15:02:44 2009 +++ php-src/ext/fileinfo/libmagic/readcdf.c Mon May 4 20:52:43 2009 @@ -79,9 +79,23 @@ if (len > 1) { s = info[i].pi_str.s_buf; if (NOTMIME(ms)) { - if (file_printf(ms, ", %s: %.*s", buf, - len, s) == -1) - return -1; + char vbuf[1024]; + size_t j; + for (j = 0; j < sizeof(vbuf) && len--; + j++, s++) { + if (*s == '\0') + break; + if (isprint((unsigned char)*s)) + vbuf[j] = *s; + } + if (j == sizeof(vbuf)) + --j; + vbuf[j] = '\0'; + if (vbuf[0]) { + if (file_printf(ms, ", %s: %s", + buf, vbuf) == -1) + return -1; + } } else if (info[i].pi_id == CDF_PROPERTY_NAME_OF_APPLICATION) { if (strstr(s, "Word")) @@ -123,7 +137,6 @@ case CDF_CLIPBOARD: break; default: - file_error(ms, 0, "Internal parsing error"); return -1; } } @@ -191,66 +204,65 @@ file_trycdf(struct magic_set *ms, int fd, const unsigned char *buf, size_t nbytes) { + cdf_info_t info; cdf_header_t h; cdf_sat_t sat, ssat; cdf_stream_t sst, scn; cdf_dir_t dir; int i; - (void)&nbytes; - (void)&buf; + const char *expn = ""; + info.i_fd = fd; + info.i_buf = buf; + info.i_len = nbytes; if (ms->flags & MAGIC_APPLE) return 0; - if (cdf_read_header(fd, &h) == -1) + if (cdf_read_header(&info, &h) == -1) return 0; #ifdef CDF_DEBUG cdf_dump_header(&h); #endif - if (cdf_read_sat(fd, &h, &sat) == -1) { - file_error(ms, errno, "Can't read SAT"); - return -1; + if ((i = cdf_read_sat(&info, &h, &sat)) == -1) { + expn = "Can't read SAT"; + goto out0; } #ifdef CDF_DEBUG - cdf_dump_sat("SAT", &h, &sat); + cdf_dump_sat("SAT", &sat, CDF_SEC_SIZE(&h)); #endif - if ((i = cdf_read_ssat(fd, &h, &sat, &ssat)) == -1) { - file_error(ms, errno, "Can't read SAT"); + if ((i = cdf_read_ssat(&info, &h, &sat, &ssat)) == -1) { + expn = "Can't read SSAT"; goto out1; } #ifdef CDF_DEBUG - cdf_dump_sat("SSAT", &h, &ssat); + cdf_dump_sat("SSAT", &ssat, CDF_SHORT_SEC_SIZE(&h)); #endif - if ((i = cdf_read_dir(fd, &h, &sat, &dir)) == -1) { - file_error(ms, errno, "Can't read directory"); + if ((i = cdf_read_dir(&info, &h, &sat, &dir)) == -1) { + expn = "Can't read directory"; goto out2; } - if ((i = cdf_read_short_stream(fd, &h, &sat, &dir, &sst)) == -1) { - file_error(ms, errno, "Cannot read short stream"); + if ((i = cdf_read_short_stream(&info, &h, &sat, &dir, &sst)) == -1) { + expn = "Cannot read short stream"; goto out3; } #ifdef CDF_DEBUG - cdf_dump_dir(fd, &h, &sat, &ssat, &sst, &dir); -#endif - if ((i = cdf_read_summary_info(fd, &h, &sat, &ssat, &sst, &dir, &scn)) - == -1) { - /* Some files don't have summary info! */ -#ifdef notyet - file_error(ms, errno, "Can't read summary_info"); -#else - i = 0; + cdf_dump_dir(&info, &h, &sat, &ssat, &sst, &dir); #endif + + if ((i = cdf_read_summary_info(&info, &h, &sat, &ssat, &sst, &dir, + &scn)) == -1) { + expn = ""; goto out4; } #ifdef CDF_DEBUG cdf_dump_summary_info(&h, &scn); #endif if ((i = cdf_file_summary_info(ms, &scn)) == -1) - file_error(ms, errno, "Can't expand summary_info"); + expn = "Can't expand summary_info"; free(scn.sst_tab); out4: free(sst.sst_tab); @@ -260,5 +272,14 @@ free(ssat.sat_tab); out1: free(sat.sat_tab); +out0: + if (i != 1) { + if (file_printf(ms, "CDF V2 Document") == -1) + return -1; + if (*expn) + if (file_printf(ms, ", corrupt: %s", expn) == -1) + return -1; + i = 1; + } return i; } http://cvs.php.net/viewvc.cgi/php-src/ext/fileinfo/libmagic/softmagic.c?r1=1.11&r2=1.12&diff_format=u Index: php-src/ext/fileinfo/libmagic/softmagic.c diff -u php-src/ext/fileinfo/libmagic/softmagic.c:1.11 php-src/ext/fileinfo/libmagic/softmagic.c:1.12 --- php-src/ext/fileinfo/libmagic/softmagic.c:1.11 Sun Mar 15 23:02:35 2009 +++ php-src/ext/fileinfo/libmagic/softmagic.c Mon May 4 20:52:43 2009 @@ -260,11 +260,14 @@ * make sure that we have a separator first. */ if (*m->desc) { - printed_something = 1; if ((e = handle_annotation(ms, m)) != 0) return e; - if (print_sep(ms, firstline) == -1) - return -1; + if (!printed_something) { + printed_something = 1; + if (print_sep(ms, firstline) + == -1) + return -1; + } } /* * This continuation matched. Print
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php