diff --git a/NEWS b/NEWS index 13f7230fe1e..f7297cca80a 100644 --- a/NEWS +++ b/NEWS @@ -1,8 +1,11 @@ PHP NEWS ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| ?? ??? 20??, PHP 5.3.3 +- Upgraded bundled libmagic to version 5.03. (Mikko) + - Added missing host validation for HTTP urls inside FILTER_VALIDATE_URL. (Ilia) +- Added stream_resolve_include_path(). (Mikko) - Fixed bug #47409 (extract() problem with array containing word "this"). (Ilia, chrisstocktonaz at gmail dot com) @@ -36,7 +39,6 @@ PHP NEWS - Added support for CURLOPT_CERTINFO. FR #49253. (Linus Nielsen Feltzing ) - Added client-side server name indication support in openssl. (Arnaud) -- Added stream_resolve_include_path() (Mikko) - Improved fix for bug #50006 (Segfault caused by uksort()). (Stas) diff --git a/ext/fileinfo/libmagic/apprentice.c b/ext/fileinfo/libmagic/apprentice.c index 86b431fa686..030961aa619 100644 --- a/ext/fileinfo/libmagic/apprentice.c +++ b/ext/fileinfo/libmagic/apprentice.c @@ -34,7 +34,7 @@ #include "file.h" #ifndef lint -FILE_RCSID("@(#)$File: apprentice.c,v 1.132 2008/03/28 18:19:30 christos Exp $") +FILE_RCSID("@(#)$File: apprentice.c,v 1.151 2009/03/18 15:19:23 christos Exp $") #endif /* lint */ #include "magic.h" @@ -44,7 +44,7 @@ FILE_RCSID("@(#)$File: apprentice.c,v 1.132 2008/03/28 18:19:30 christos Exp $") #ifdef PHP_WIN32 #include "win32/unistd.h" #if _MSC_VER <= 1300 -#include "win32/php_strtoi64.h" +# include "win32/php_strtoi64.h" #endif #define strtoull _strtoui64 #else @@ -55,7 +55,9 @@ FILE_RCSID("@(#)$File: apprentice.c,v 1.132 2008/03/28 18:19:30 christos Exp $") #include #include #include - +#ifndef PHP_WIN32 +#include +#endif #define EATAB {while (isascii((unsigned char) *l) && \ isspace((unsigned char) *l)) ++l;} @@ -609,7 +611,11 @@ load_1(struct magic_set *ms, int action, const char *fn, int *errs, } else { /* read and parse this file */ +#if (PHP_MAJOR_VERSION < 6) for (ms->line = 1; (line = php_stream_get_line(stream, buffer , BUFSIZ, &line_len)) != NULL; ms->line++) { +#else + for (ms->line = 1; (line = php_stream_get_line(stream, ZSTR(buffer), BUFSIZ, &line_len)) != NULL; ms->line++) { +#endif if (line_len == 0) /* null line, garbage, etc */ continue; @@ -851,9 +857,9 @@ file_signextend(struct magic_set *ms, struct magic *m, uint64_t v) case FILE_INDIRECT: break; default: - if (ms->flags & MAGIC_CHECK) { - file_magwarn(ms, "cannot happen: m->type=%d\n", m->type); - } + if (ms->flags & MAGIC_CHECK) + file_magwarn(ms, "cannot happen: m->type=%d\n", + m->type); return ~0U; } } @@ -1669,7 +1675,7 @@ check_format(struct magic_set *ms, struct magic *m) */ file_magwarn(ms, "Printf format `%c' is not valid for type " "`%s' in description `%s'", *ptr ? *ptr : '?', - file_names[m->type], m->desc); + file_names[m->type], m->desc); return -1; } diff --git a/ext/fileinfo/libmagic/apptype.c b/ext/fileinfo/libmagic/apptype.c index 85136ed1564..31b8095e13b 100644 --- a/ext/fileinfo/libmagic/apptype.c +++ b/ext/fileinfo/libmagic/apptype.c @@ -27,10 +27,9 @@ #include "file.h" #ifndef lint -FILE_RCSID("@(#)$File: apptype.c,v 1.7 2007/01/12 17:38:27 christos Exp $") +FILE_RCSID("@(#)$File: apptype.c,v 1.11 2009/02/04 18:24:32 christos Exp $") #endif /* lint */ - #include #include diff --git a/ext/fileinfo/libmagic/ascmagic.c b/ext/fileinfo/libmagic/ascmagic.c index 4fee8a87b2e..e73b26fe9b6 100644 --- a/ext/fileinfo/libmagic/ascmagic.c +++ b/ext/fileinfo/libmagic/ascmagic.c @@ -2,7 +2,7 @@ * Copyright (c) Ian F. Darwin 1986-1995. * Software written by Ian F. Darwin and others; * maintained 1995-present by Christos Zoulas and others. - * + * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: @@ -12,7 +12,7 @@ * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. - * + * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE @@ -36,7 +36,7 @@ #include "file.h" #ifndef lint -FILE_RCSID("@(#)$File: ascmagic.c,v 1.62 2008/03/01 22:21:48 rrt Exp $") +FILE_RCSID("@(#)$File: ascmagic.c,v 1.75 2009/02/03 20:27:51 christos Exp $") #endif /* lint */ #include "magic.h" @@ -66,14 +66,14 @@ trim_nuls(const unsigned char *buf, size_t nbytes) { while (nbytes > 1 && buf[nbytes - 1] == '\0') nbytes--; - + return nbytes; } protected int file_ascmagic(struct magic_set *ms, const unsigned char *buf, size_t nbytes) { - unichar *ubuf = NULL; + unichar *ubuf = NULL; size_t ulen; int rv = 1; @@ -264,7 +264,7 @@ subtype_identified: if (file_printf(ms, ", with") == -1) goto done; - if (n_crlf == 0 && n_cr == 0 && n_nel == 0 && n_lf == 0) { + if (n_crlf == 0 && n_cr == 0 && n_nel == 0 && n_lf == 0) { if (file_printf(ms, " no") == -1) goto done; } else { diff --git a/ext/fileinfo/libmagic/cdf.c b/ext/fileinfo/libmagic/cdf.c index eecfa1e4520..a3b4a11fc0e 100644 --- a/ext/fileinfo/libmagic/cdf.c +++ b/ext/fileinfo/libmagic/cdf.c @@ -32,7 +32,7 @@ #include "file.h" #ifndef lint -FILE_RCSID("@(#)$File: cdf.c,v 1.17 2009/02/03 20:27:51 christos Exp $") +FILE_RCSID("@(#)$File: cdf.c,v 1.30 2009/05/06 14:29:47 christos Exp $") #endif #include @@ -237,6 +237,19 @@ cdf_unpack_dir(cdf_directory_t *d, char *buf) CDF_UNPACK(d->d_unused0); } +static int +cdf_check_stream_offset(const cdf_stream_t *sst, const void *p, size_t tail) +{ + const char *b = (const char *)sst->sst_tab; + const char *e = ((const char *)p) + tail; + if (e >= b && (size_t)(e - b) < sst->sst_dirlen * sst->sst_len) + return 0; + DPRINTF((stderr, "offset begin %p end %p %zu >= %zu\n", b, e, + (size_t)(e - b), sst->sst_dirlen * sst->sst_len)); + errno = EFTYPE; + return -1; +} + static ssize_t cdf_read(const cdf_info_t *info, off_t off, void *buf, size_t len) { @@ -264,7 +277,6 @@ cdf_read(const cdf_info_t *info, off_t off, void *buf, size_t len) return (ssize_t)len; } - int cdf_read_header(const cdf_info_t *info, cdf_header_t *h) { @@ -332,15 +344,15 @@ cdf_read_sat(const cdf_info_t *info, cdf_header_t *h, cdf_sat_t *sat) break; #define CDF_SEC_LIMIT (UINT32_MAX / (4 * ss)) - if (h->h_num_sectors_in_master_sat > CDF_SEC_LIMIT || - i > CDF_SEC_LIMIT / nsatpersec) { + if (h->h_num_sectors_in_master_sat > CDF_SEC_LIMIT / nsatpersec || + i > CDF_SEC_LIMIT) { 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; + sat->sat_len = h->h_num_sectors_in_master_sat * nsatpersec + i; DPRINTF(("sat_len = %zu ss = %zu\n", sat->sat_len, ss)); if ((sat->sat_tab = calloc(sat->sat_len, ss)) == NULL) return -1; @@ -360,6 +372,8 @@ cdf_read_sat(const cdf_info_t *info, cdf_header_t *h, cdf_sat_t *sat) mid = h->h_secid_first_sector_in_master_sat; for (j = 0; j < h->h_num_sectors_in_master_sat; j++) { + if (mid < 0) + goto out; if (j >= CDF_LOOP_LIMIT) { DPRINTF(("Reading master sector loop limit")); errno = EFTYPE; @@ -371,10 +385,8 @@ cdf_read_sat(const cdf_info_t *info, cdf_header_t *h, cdf_sat_t *sat) } for (k = 0; k < nsatpersec; k++, i++) { sec = CDF_TOLE4(msa[k]); - if (sec < 0) { - sat->sat_len = i; - break; - } + if (sec < 0) + goto out; if (i >= sat->sat_len) { DPRINTF(("Out of bounds reading MSA %u >= %u", i, sat->sat_len)); @@ -390,6 +402,8 @@ cdf_read_sat(const cdf_info_t *info, cdf_header_t *h, cdf_sat_t *sat) } mid = CDF_TOLE4(msa[nsatpersec]); } +out: + sat->sat_len = i; free(msa); return 0; out2: @@ -478,7 +492,7 @@ cdf_read_short_sector_chain(const cdf_header_t *h, scn->sst_len = cdf_count_chain(ssat, sid, CDF_SEC_SIZE(h)); scn->sst_dirlen = len; - if (scn->sst_len == (size_t)-1) + if (sst->sst_tab == NULL || scn->sst_len == (size_t)-1) return -1; scn->sst_tab = calloc(scn->sst_len, ss); @@ -629,22 +643,21 @@ cdf_read_short_stream(const cdf_info_t *info, const cdf_header_t *h, break; /* If the it is not there, just fake it; some docs don't have it */ - if (i == dir->dir_len) { - scn->sst_tab = NULL; - scn->sst_len = 0; - return 0; - } + if (i == dir->dir_len) + goto out; d = &dir->dir_tab[i]; /* If the it is not there, just fake it; some docs don't have it */ - if (d->d_stream_first_sector < 0) { - scn->sst_tab = NULL; - scn->sst_len = 0; - return 0; - } + if (d->d_stream_first_sector < 0) + goto out; return cdf_read_long_sector_chain(info, h, sat, d->d_stream_first_sector, d->d_size, scn); +out: + scn->sst_tab = NULL; + scn->sst_len = 0; + scn->sst_dirlen = 0; + return 0; } static int @@ -697,15 +710,27 @@ cdf_read_property_info(const cdf_stream_t *sst, uint32_t offs, size_t i, o, nelements, j; cdf_property_info_t *inp; - 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); -#define CDF_PROP_LIM (UINT32_MAX / (4 * sizeof(*inp))) - if (sh.sh_properties > CDF_PROP_LIM) + if (offs > UINT32_MAX / 4) { + errno = EFTYPE; goto out; - DPRINTF(("section len: %u properties %u\n", sh.sh_len, sh.sh_properties)); + } + shp = (const void *)((const char *)sst->sst_tab + offs); + if (cdf_check_stream_offset(sst, shp, sizeof(*shp)) == -1) + goto out; + sh.sh_len = CDF_TOLE4(shp->sh_len); +#define CDF_SHLEN_LIMIT (UINT32_MAX / 8) + if (sh.sh_len > CDF_SHLEN_LIMIT) { + errno = EFTYPE; + goto out; + } + sh.sh_properties = CDF_TOLE4(shp->sh_properties); +#define CDF_PROP_LIMIT (UINT32_MAX / (4 * sizeof(*inp))) + if (sh.sh_properties > CDF_PROP_LIMIT) + goto out; + DPRINTF(("section len: %u properties %u\n", sh.sh_len, + sh.sh_properties)); if (*maxcount) { - if (*maxcount > CDF_PROP_LIM) + if (*maxcount > CDF_PROP_LIMIT) goto out; *maxcount += sh.sh_properties; inp = realloc(*info, *maxcount * sizeof(*inp)); @@ -720,6 +745,8 @@ cdf_read_property_info(const cdf_stream_t *sst, uint32_t offs, *count += sh.sh_properties; p = (const void *)((const char *)sst->sst_tab + offs + sizeof(sh)); e = (const void *)(((const char *)shp) + sh.sh_len); + if (cdf_check_stream_offset(sst, e, 0) == -1) + goto out; for (i = 0; i < sh.sh_properties; i++) { q = (const uint32_t *)((const char *)p + CDF_TOLE4(p[(i << 1) + 1])) - 2; @@ -777,8 +804,8 @@ cdf_read_property_info(const cdf_stream_t *sst, uint32_t offs, case CDF_LENGTH32_STRING: if (nelements > 1) { size_t nelem = inp - *info; - if (*maxcount > CDF_PROP_LIM - || nelements > CDF_PROP_LIM) + if (*maxcount > CDF_PROP_LIMIT + || nelements > CDF_PROP_LIMIT) goto out; *maxcount += nelements; inp = realloc(*info, *maxcount * sizeof(*inp)); @@ -832,6 +859,9 @@ cdf_unpack_summary_info(const cdf_stream_t *sst, cdf_summary_info_header_t *ssi, const cdf_section_declaration_t *sd = (const void *) ((const char *)sst->sst_tab + CDF_SECTION_DECLARATION_OFFSET); + if (cdf_check_stream_offset(sst, si, sizeof(*si)) == -1 || + cdf_check_stream_offset(sst, sd, sizeof(*sd)) == -1) + return -1; ssi->si_byte_order = CDF_TOLE2(si->si_byte_order); ssi->si_os_version = CDF_TOLE2(si->si_os_version); ssi->si_os = CDF_TOLE2(si->si_os); @@ -946,11 +976,13 @@ cdf_dump_header(const cdf_header_t *h) size_t i; #define DUMP(a, b) (void)fprintf(stderr, "%40.40s = " a "\n", # b, h->h_ ## b) +#define DUMP2(a, b) (void)fprintf(stderr, "%40.40s = " a " (" a ")\n", # b, \ + h->h_ ## b, 1 << h->h_ ## b) DUMP("%d", revision); DUMP("%d", version); DUMP("0x%x", byte_order); - DUMP("%d", sec_size_p2); - DUMP("%d", short_sec_size_p2); + DUMP2("%d", sec_size_p2); + DUMP2("%d", short_sec_size_p2); DUMP("%d", num_sectors_in_sat); DUMP("%d", secid_first_directory); DUMP("%d", min_size_standard_stream); @@ -1202,7 +1234,7 @@ main(int argc, char *argv[]) #endif - if (cdf_read_summary_info(&inf, &h, &sat, &ssat, &sst, &dir, + if (cdf_read_summary_info(&info, &h, &sat, &ssat, &sst, &dir, &scn) == -1) err(1, "Cannot read summary info"); #ifdef CDF_DEBUG diff --git a/ext/fileinfo/libmagic/cdf_time.c b/ext/fileinfo/libmagic/cdf_time.c index ac416ea2fe2..36372966a78 100644 --- a/ext/fileinfo/libmagic/cdf_time.c +++ b/ext/fileinfo/libmagic/cdf_time.c @@ -27,7 +27,7 @@ #include "file.h" #ifndef lint -FILE_RCSID("@(#)$File: cdf_time.c,v 1.5 2009/02/03 20:27:51 christos Exp $") +FILE_RCSID("@(#)$File: cdf_time.c,v 1.6 2009/03/10 11:44:29 christos Exp $") #endif #include diff --git a/ext/fileinfo/libmagic/compress.c b/ext/fileinfo/libmagic/compress.c index 06786657d7a..de4de3401cd 100644 --- a/ext/fileinfo/libmagic/compress.c +++ b/ext/fileinfo/libmagic/compress.c @@ -32,12 +32,11 @@ * uncompress(method, old, n, newch) - uncompress old into new, * using method, return sizeof new */ - #include "config.h" #include "file.h" #ifndef lint -FILE_RCSID("@(#)$File: compress.c,v 1.56 2008/02/07 00:58:52 christos Exp $") +FILE_RCSID("@(#)$File: compress.c,v 1.63 2009/03/23 14:21:51 christos Exp $") #endif #include "magic.h" @@ -89,7 +88,6 @@ private const struct { #define NODATA ((size_t)~0) - private ssize_t swrite(int, const void *, size_t); #ifdef PHP_FILEINFO_UNCOMPRESS private size_t uncompressbuf(struct magic_set *, int, size_t, @@ -107,10 +105,13 @@ file_zmagic(struct magic_set *ms, int fd, const char *name, size_t i, nsz; int rv = 0; int mime = ms->flags & MAGIC_MIME; + size_t ncompr; if ((ms->flags & MAGIC_COMPRESS) == 0) return 0; + ncompr = sizeof(compr) / sizeof(compr[0]); + for (i = 0; i < ncompr; i++) { if (nbytes < compr[i].maglen) continue; @@ -189,6 +190,7 @@ sread(int fd, void *buf, size_t n, int canbepipe) #ifdef FIONREAD if ((canbepipe && (ioctl(fd, FIONREAD, &t) == -1)) || (t == 0)) { #ifdef FD_ZERO + int cnt; for (cnt = 0;; cnt++) { fd_set check; struct timeval tout = {0, 100 * 1000}; @@ -310,6 +312,7 @@ file_pipe2file(struct magic_set *ms, int fd, const void *startbuf, #define FNAME (1 << 3) #define FCOMMENT (1 << 4) + private size_t uncompressgzipped(struct magic_set *ms, const unsigned char *old, unsigned char **newch, size_t n) @@ -373,7 +376,6 @@ uncompressgzipped(struct magic_set *ms, const unsigned char *old, } #endif - private size_t uncompressbuf(struct magic_set *ms, int fd, size_t method, const unsigned char *old, unsigned char **newch, size_t n) @@ -490,7 +492,7 @@ err: (void)wait(NULL); #endif (void) close(fdin[0]); - + return n; } } diff --git a/ext/fileinfo/libmagic/file.h b/ext/fileinfo/libmagic/file.h index 58211f19253..915602fa6fb 100644 --- a/ext/fileinfo/libmagic/file.h +++ b/ext/fileinfo/libmagic/file.h @@ -2,7 +2,7 @@ * Copyright (c) Ian F. Darwin 1986-1995. * Software written by Ian F. Darwin and others; * maintained 1995-present by Christos Zoulas and others. - * + * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: @@ -12,7 +12,7 @@ * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. - * + * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE @@ -27,7 +27,7 @@ */ /* * file.h - definitions for file(1) program - * @(#)$File: file.h,v 1.103 2008/03/01 22:21:49 rrt Exp $ + * @(#)$File: file.h,v 1.119 2009/02/04 18:24:32 christos Exp $ */ #ifndef __file_h__ @@ -138,7 +138,7 @@ struct magic { #define UNSIGNED 0x08 /* comparison is unsigned */ #define NOSPACE 0x10 /* suppress space character before output */ #define BINTEST 0x20 /* test is for a binary type (set only - for top-level tests) */ + for top-level tests) */ #define TEXTTEST 0 /* for passing to file_softmagic */ uint8_t factor; @@ -216,7 +216,7 @@ struct magic { #else uint8_t dummy; #endif - uint8_t factor_op; + uint8_t factor_op; #define FILE_FACTOR_OP_PLUS '+' #define FILE_FACTOR_OP_MINUS '-' #define FILE_FACTOR_OP_TIMES '*' @@ -264,7 +264,7 @@ struct magic { #define str_range _u._s._count #define str_flags _u._s._flags /* Words 9-16 */ - union VALUETYPE value; /* either number of string */ + union VALUETYPE value; /* either number or string */ /* Words 17-24 */ char desc[MAXDESC]; /* description */ /* Words 25-32 */ @@ -312,7 +312,6 @@ struct level_info { int last_cond; /* used for error checking by parse() */ #endif }; - struct magic_set { struct mlist *mlist; struct cont { diff --git a/ext/fileinfo/libmagic/fsmagic.c b/ext/fileinfo/libmagic/fsmagic.c index dd84db88ed6..ca217139847 100644 --- a/ext/fileinfo/libmagic/fsmagic.c +++ b/ext/fileinfo/libmagic/fsmagic.c @@ -176,7 +176,7 @@ file_fsmagic(struct magic_set *ms, const char *fn, struct stat *sb, php_stream * return 1; # endif #endif - + #ifdef S_IFIFO case S_IFIFO: if((ms->flags & MAGIC_DEVICES) != 0) diff --git a/ext/fileinfo/libmagic/funcs.c b/ext/fileinfo/libmagic/funcs.c index f36f9b29aa7..3ca5408088b 100644 --- a/ext/fileinfo/libmagic/funcs.c +++ b/ext/fileinfo/libmagic/funcs.c @@ -1,7 +1,7 @@ /* * Copyright (c) Christos Zoulas 2003. * All Rights Reserved. - * + * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: @@ -11,7 +11,7 @@ * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. - * + * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE @@ -27,7 +27,7 @@ #include "file.h" #ifndef lint -FILE_RCSID("@(#)$File: funcs.c,v 1.39 2008/03/01 22:21:49 rrt Exp $") +FILE_RCSID("@(#)$File: funcs.c,v 1.53 2009/04/07 11:07:00 christos Exp $") #endif /* lint */ #include "magic.h" @@ -392,7 +392,7 @@ file_getbuffer(struct magic_set *ms) for (np = ms->o.pbuf, op = ms->o.buf; *op; op++) { if (isprint((unsigned char)*op)) { - *np++ = *op; + *np++ = *op; } else { OCTALIFY(np, op); } diff --git a/ext/fileinfo/libmagic/is_tar.c b/ext/fileinfo/libmagic/is_tar.c index 9802877e8cf..f962edbd8ee 100644 --- a/ext/fileinfo/libmagic/is_tar.c +++ b/ext/fileinfo/libmagic/is_tar.c @@ -40,7 +40,7 @@ #include "file.h" #ifndef lint -FILE_RCSID("@(#)$File: is_tar.c,v 1.31 2008/02/04 20:51:17 christos Exp $") +FILE_RCSID("@(#)$File: is_tar.c,v 1.36 2009/02/03 20:27:51 christos Exp $") #endif #include "magic.h" diff --git a/ext/fileinfo/libmagic/magic.c b/ext/fileinfo/libmagic/magic.c index 9c4b3bf4de4..849896bc837 100644 --- a/ext/fileinfo/libmagic/magic.c +++ b/ext/fileinfo/libmagic/magic.c @@ -1,7 +1,7 @@ /* * Copyright (c) Christos Zoulas 2003. * All Rights Reserved. - * + * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: @@ -11,7 +11,7 @@ * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. - * + * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE @@ -28,7 +28,7 @@ #include "file.h" #ifndef lint -FILE_RCSID("@(#)$File: magic.c,v 1.50 2008/02/19 00:58:59 rrt Exp $") +FILE_RCSID("@(#)$File: magic.c,v 1.62 2009/03/20 21:25:41 christos Exp $") #endif /* lint */ #include "magic.h" @@ -65,9 +65,10 @@ FILE_RCSID("@(#)$File: magic.c,v 1.50 2008/02/19 00:58:59 rrt Exp $") #ifndef PHP_WIN32 # include /* for byte swapping */ #endif + #include "patchlevel.h" -#ifndef PIPE_BUF +#ifndef PIPE_BUF /* Get the PIPE_BUF from pathconf */ #ifdef _PC_PIPE_BUF #define PIPE_BUF pathconf(".", _PC_PIPE_BUF) @@ -199,6 +200,7 @@ private void close_and_restore(const struct magic_set *ms, const char *name, int fd, const struct stat *sb) { + if ((ms->flags & MAGIC_PRESERVE_ATIME) != 0) { /* * Try to restore access, modification times if read it. @@ -303,7 +305,7 @@ file_or_stream(struct magic_set *ms, const char *inname, php_stream *stream) } #ifdef O_NONBLOCK - /* we should be already be in non blocking mode for network socket */ +/* we should be already be in non blocking mode for network socket */ #endif /* diff --git a/ext/fileinfo/libmagic/magic.h b/ext/fileinfo/libmagic/magic.h index 2e0fdc39211..ba037921d36 100644 --- a/ext/fileinfo/libmagic/magic.h +++ b/ext/fileinfo/libmagic/magic.h @@ -1,7 +1,7 @@ /* * Copyright (c) Christos Zoulas 2003. * All Rights Reserved. - * + * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: @@ -11,7 +11,7 @@ * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. - * + * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE diff --git a/ext/fileinfo/libmagic/patchlevel.h b/ext/fileinfo/libmagic/patchlevel.h index 12e685af8f7..f458f56c0b6 100644 --- a/ext/fileinfo/libmagic/patchlevel.h +++ b/ext/fileinfo/libmagic/patchlevel.h @@ -6,14 +6,14 @@ * $File: patchlevel.h,v 1.68 2008/03/22 21:39:43 christos Exp $ * * $Log$ - * Revision 1.1.2.3 2009/05/04 20:54:53 scottmac - * MFH Update libmagic to 5.02 + * Revision 1.4 2009/05/04 20:52:43 scottmac + * Update libmagic to 5.02 * - * Revision 1.1.2.2 2009/03/15 23:04:18 scottmac - * MFH Update fileinfo to libmagic 5.00 and remove dependency on dirent.h on Windows + * Revision 1.3 2009/03/15 23:02:35 scottmac + * Update fileinfo to libmagic 5.00 and remove dependency on dirent.h on Windows * - * Revision 1.1.2.1 2008/11/02 16:13:49 scottmac - * MFH: Sync libmagic with 4.26 and add support for the new v6 magic file format + * Revision 1.2 2008/11/02 16:09:27 scottmac + * Update libmagic to 4.26 and add support for v6 of the magic file format. * * Revision 1.1 2008/07/11 14:13:50 derick * - Move lib to libmagic diff --git a/ext/fileinfo/libmagic/print.c b/ext/fileinfo/libmagic/print.c index acba041bcc4..fd10126b1f5 100644 --- a/ext/fileinfo/libmagic/print.c +++ b/ext/fileinfo/libmagic/print.c @@ -34,7 +34,7 @@ #include "file.h" #ifndef lint -FILE_RCSID("@(#)$File: print.c,v 1.63 2008/02/17 19:28:54 rrt Exp $") +FILE_RCSID("@(#)$File: print.c,v 1.66 2009/02/03 20:27:51 christos Exp $") #endif /* lint */ #include diff --git a/ext/fileinfo/libmagic/readcdf.c b/ext/fileinfo/libmagic/readcdf.c index a12fa9c9b38..56d6504039d 100644 --- a/ext/fileinfo/libmagic/readcdf.c +++ b/ext/fileinfo/libmagic/readcdf.c @@ -26,17 +26,15 @@ #include "file.h" #ifndef lint -FILE_RCSID("@(#)$File: readcdf.c,v 1.11 2009/02/03 20:27:51 christos Exp $") +FILE_RCSID("@(#)$File: readcdf.c,v 1.18 2009/05/06 20:48:22 christos Exp $") #endif #include - #ifdef PHP_WIN32 #include "win32/unistd.h" #else #include #endif - #include #include #include @@ -202,7 +200,7 @@ protected int file_trycdf(struct magic_set *ms, int fd, const unsigned char *buf, size_t nbytes) { - cdf_info_t info; + cdf_info_t info; cdf_header_t h; cdf_sat_t sat, ssat; cdf_stream_t sst, scn; @@ -246,7 +244,6 @@ file_trycdf(struct magic_set *ms, int fd, const unsigned char *buf, expn = "Cannot read short stream"; goto out3; } - #ifdef CDF_DEBUG cdf_dump_dir(&info, &h, &sat, &ssat, &sst, &dir); #endif diff --git a/ext/fileinfo/libmagic/readelf.c b/ext/fileinfo/libmagic/readelf.c index e78b5ef3794..5429b503b41 100644 --- a/ext/fileinfo/libmagic/readelf.c +++ b/ext/fileinfo/libmagic/readelf.c @@ -27,7 +27,7 @@ #include "file.h" #ifndef lint -FILE_RCSID("@(#)$File: readelf.c,v 1.73 2008/03/27 22:00:28 christos Exp $") +FILE_RCSID("@(#)$File: readelf.c,v 1.81 2008/11/04 16:38:28 christos Exp $") #endif #ifdef BUILTIN_ELF @@ -1118,6 +1118,7 @@ dophn_exec(struct magic_set *ms, int clazz, int swap, int fd, off_t off, return 0; } + protected int file_tryelf(struct magic_set *ms, int fd, const unsigned char *buf, size_t nbytes) @@ -1137,7 +1138,6 @@ file_tryelf(struct magic_set *ms, int fd, const unsigned char *buf, if (ms->flags & (MAGIC_MIME|MAGIC_APPLE)) return 0; - /* * ELF executables have multiple section headers in arbitrary * file locations and thus file(1) cannot determine it from easily. diff --git a/ext/fileinfo/libmagic/softmagic.c b/ext/fileinfo/libmagic/softmagic.c index 5bed6e64b12..0a06d00f8af 100644 --- a/ext/fileinfo/libmagic/softmagic.c +++ b/ext/fileinfo/libmagic/softmagic.c @@ -2,7 +2,7 @@ * Copyright (c) Ian F. Darwin 1986-1995. * Software written by Ian F. Darwin and others; * maintained 1995-present by Christos Zoulas and others. - * + * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: @@ -12,7 +12,7 @@ * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. - * + * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE @@ -32,7 +32,7 @@ #include "file.h" #ifndef lint -FILE_RCSID("@(#)$File: softmagic.c,v 1.117 2008/03/01 22:21:49 rrt Exp $") +FILE_RCSID("@(#)$File: softmagic.c,v 1.135 2009/03/27 22:42:49 christos Exp $") #endif /* lint */ #include "magic.h" @@ -149,7 +149,7 @@ match(struct magic_set *ms, struct magic *magic, uint32_t nmagic, default: if (m->type == FILE_INDIRECT) returnval = 1; - + switch (magiccheck(ms, m)) { case -1: return -1; @@ -163,7 +163,7 @@ match(struct magic_set *ms, struct magic *magic, uint32_t nmagic, break; } if (flush) { - /* + /* * main entry didn't match, * flush its continuations */ @@ -188,7 +188,7 @@ match(struct magic_set *ms, struct magic *magic, uint32_t nmagic, if (print && mprint(ms, m) == -1) - return -1; + return -1; ms->c.li[cont_level].off = moffset(ms, m); @@ -227,7 +227,7 @@ match(struct magic_set *ms, struct magic *magic, uint32_t nmagic, return -1; case 0: if (m->reln != '!') - continue; + continue; flush = 1; break; default: @@ -305,11 +305,11 @@ match(struct magic_set *ms, struct magic *magic, uint32_t nmagic, if (printed_something) { firstline = 0; if (print) - returnval = 1; + returnval = 1; } if ((ms->flags & MAGIC_CONTINUE) == 0 && printed_something) { return returnval; /* don't keep searching */ - } + } } return returnval; /* This is hit if -k is set or there is no match */ } @@ -377,7 +377,8 @@ mprint(struct magic_set *ms, struct magic *m) return -1; break; default: - if (file_printf(ms, m->desc, (unsigned short) v) == -1) + if ( + file_printf(ms, m->desc, (unsigned short) v) == -1) return -1; break; } @@ -932,7 +933,7 @@ mcopy(struct magic_set *ms, union VALUETYPE *p, int type, int indir, } if (lines) last = (const char *)s + nbytes; - + ms->search.s = buf; ms->search.s_len = last - buf; ms->search.offset = offset; @@ -945,10 +946,10 @@ mcopy(struct magic_set *ms, union VALUETYPE *p, int type, int indir, const unsigned char *esrc = s + nbytes; char *dst = p->s; char *edst = &p->s[sizeof(p->s) - 1]; - + if (type == FILE_BESTRING16) src++; - + /* check for pointer overflow */ if (src < s) { file_magerror(ms, "invalid offset %u in mcopy()", @@ -1506,14 +1507,14 @@ mget(struct magic_set *ms, const unsigned char *s, if (nbytes < (offset + 1)) /* should alway be true */ return 0; break; - + case FILE_SHORT: case FILE_BESHORT: case FILE_LESHORT: if (nbytes < (offset + 2)) return 0; break; - + case FILE_LONG: case FILE_BELONG: case FILE_LELONG: @@ -1532,7 +1533,7 @@ mget(struct magic_set *ms, const unsigned char *s, if (nbytes < (offset + 4)) return 0; break; - + case FILE_DOUBLE: case FILE_BEDOUBLE: case FILE_LEDOUBLE: @@ -1591,7 +1592,7 @@ file_strncmp(const char *s1, const char *s2, size_t len, uint32_t flags) if (0L == flags) { /* normal string: do it fast */ while (len-- > 0) if ((v = *b++ - *a++) != '\0') - break; + break; } else { /* combine the others */ while (len-- > 0) { @@ -1605,8 +1606,8 @@ file_strncmp(const char *s1, const char *s2, size_t len, uint32_t flags) if ((v = toupper(*b++) - *a++) != '\0') break; } - else if ((flags & STRING_COMPACT_BLANK) && - isspace(*a)) { + else if ((flags & STRING_COMPACT_BLANK) && + isspace(*a)) { a++; if (isspace(*b++)) { while (isspace(*b)) @@ -1761,23 +1762,23 @@ magiccheck(struct magic_set *ms, struct magic *m) case 'x': matched = 1; break; - + case '!': matched = fv != fl; break; - + case '=': matched = fv == fl; break; - + case '>': matched = fv > fl; break; - + case '<': matched = fv < fl; break; - + default: matched = 0; file_magerror(ms, "cannot happen with float: invalid relation `%c'", @@ -1795,23 +1796,23 @@ magiccheck(struct magic_set *ms, struct magic *m) case 'x': matched = 1; break; - + case '!': matched = dv != dl; break; - + case '=': matched = dv == dl; break; - + case '>': matched = dv > dl; break; - + case '<': matched = dv < dl; break; - + default: matched = 0; file_magerror(ms, "cannot happen with double: invalid relation `%c'", m->reln); @@ -1859,7 +1860,6 @@ magiccheck(struct magic_set *ms, struct magic *m) } break; } - case FILE_REGEX: { zval *pattern; int options = 0; @@ -1867,9 +1867,7 @@ magiccheck(struct magic_set *ms, struct magic *m) TSRMLS_FETCH(); MAKE_STD_ZVAL(pattern); - Z_STRVAL_P(pattern) = (char *)m->value.s; - Z_STRLEN_P(pattern) = m->vallen; - Z_TYPE_P(pattern) = IS_STRING; + ZVAL_STRINGL(pattern, (char *)m->value.s, m->vallen, 0); options |= PCRE_MULTILINE; @@ -1878,8 +1876,14 @@ magiccheck(struct magic_set *ms, struct magic *m) } convert_libmagic_pattern(pattern, options); - + +#if (PHP_MAJOR_VERSION < 6) if ((pce = pcre_get_compiled_regex_cache(Z_STRVAL_P(pattern), Z_STRLEN_P(pattern) TSRMLS_CC)) == NULL) { +#else + if ((pce = pcre_get_compiled_regex_cache(IS_STRING, Z_STRVAL_P(pattern), Z_STRLEN_P(pattern) TSRMLS_CC)) == NULL) { +#endif + zval_dtor(pattern); + FREE_ZVAL(pattern); return -1; } else { /* pce now contains the compiled regex */ @@ -1894,16 +1898,19 @@ magiccheck(struct magic_set *ms, struct magic *m) haystack = estrndup(ms->search.s, ms->search.s_len); /* match v = 0, no match v = 1 */ +#if (PHP_MAJOR_VERSION < 6) php_pcre_match_impl(pce, haystack, ms->search.s_len, retval, subpats, 1, 1, PREG_OFFSET_CAPTURE, 0 TSRMLS_CC); - +#else + php_pcre_match_impl(pce, IS_STRING, haystack, ms->search.s_len, retval, subpats, 1, 1, PREG_OFFSET_CAPTURE, 0 TSRMLS_CC); +#endif /* Free haystack */ efree(haystack); if (Z_LVAL_P(retval) < 0) { zval_ptr_dtor(&subpats); FREE_ZVAL(retval); - efree(Z_STRVAL_P(pattern)); - efree(pattern); + zval_dtor(pattern); + FREE_ZVAL(pattern); return -1; } else if ((Z_LVAL_P(retval) > 0) && (Z_TYPE_P(subpats) == IS_ARRAY)) { @@ -1991,8 +1998,8 @@ magiccheck(struct magic_set *ms, struct magic *m) } else { zval_ptr_dtor(&subpats); FREE_ZVAL(retval); - efree(Z_STRVAL_P(pattern)); - efree(pattern); + zval_dtor(pattern); + FREE_ZVAL(pattern); return -1; } } @@ -2004,8 +2011,8 @@ magiccheck(struct magic_set *ms, struct magic *m) zval_ptr_dtor(&subpats); FREE_ZVAL(retval); } - efree(Z_STRVAL_P(pattern)); - efree(pattern); + zval_dtor(pattern); + FREE_ZVAL(pattern); break; } case FILE_INDIRECT: @@ -2123,7 +2130,7 @@ print_sep(struct magic_set *ms, int firstline) if (firstline) return 0; /* - * we found another match + * we found another match * put a newline and '-' to do some simple formatting */ return file_printf(ms, "\n- ");