diff options
Diffstat (limited to 'ext/fileinfo/libmagic.patch')
-rw-r--r-- | ext/fileinfo/libmagic.patch | 1031 |
1 files changed, 361 insertions, 670 deletions
diff --git a/ext/fileinfo/libmagic.patch b/ext/fileinfo/libmagic.patch index 39807ac00b..bb9a0dafae 100644 --- a/ext/fileinfo/libmagic.patch +++ b/ext/fileinfo/libmagic.patch @@ -1,6 +1,6 @@ diff -u libmagic.orig/apprentice.c libmagic/apprentice.c ---- libmagic.orig/apprentice.c Thu Mar 21 18:45:14 2013 -+++ libmagic/apprentice.c Fri Apr 11 12:36:52 2014 +--- libmagic.orig/apprentice.c Tue Nov 19 22:01:12 2013 ++++ libmagic/apprentice.c Mon Mar 31 17:15:53 2014 @@ -29,6 +29,8 @@ * apprentice - make one pass through /etc/magic, learning its secrets. */ @@ -46,7 +46,7 @@ diff -u libmagic.orig/apprentice.c libmagic/apprentice.c #define EATAB {while (isascii((unsigned char) *l) && \ isspace((unsigned char) *l)) ++l;} -@@ -143,38 +157,7 @@ +@@ -148,38 +162,7 @@ { NULL, 0, NULL } }; @@ -86,7 +86,7 @@ diff -u libmagic.orig/apprentice.c libmagic/apprentice.c struct type_tbl_s { const char name[16]; -@@ -255,6 +238,10 @@ +@@ -261,6 +244,10 @@ # undef XX # undef XX_NULL @@ -97,7 +97,7 @@ diff -u libmagic.orig/apprentice.c libmagic/apprentice.c private int get_type(const struct type_tbl_s *tbl, const char *l, const char **t) { -@@ -378,7 +365,7 @@ +@@ -384,7 +371,7 @@ { struct mlist *ml; @@ -106,7 +106,7 @@ diff -u libmagic.orig/apprentice.c libmagic/apprentice.c return -1; ml->map = idx == 0 ? map : NULL; -@@ -416,12 +403,13 @@ +@@ -422,12 +409,13 @@ return apprentice_compile(ms, map, fn); } @@ -124,7 +124,7 @@ diff -u libmagic.orig/apprentice.c libmagic/apprentice.c if (map == NULL) return -1; } -@@ -444,7 +432,6 @@ +@@ -450,7 +438,6 @@ } return 0; @@ -132,7 +132,7 @@ diff -u libmagic.orig/apprentice.c libmagic/apprentice.c } protected void -@@ -455,10 +442,16 @@ +@@ -461,10 +448,16 @@ return; for (i = 0; i < MAGIC_SETS; i++) mlist_free(ms->mlist[i]); @@ -153,7 +153,7 @@ diff -u libmagic.orig/apprentice.c libmagic/apprentice.c } protected struct magic_set * -@@ -467,7 +460,7 @@ +@@ -473,7 +466,7 @@ struct magic_set *ms; size_t i, len; @@ -162,7 +162,7 @@ diff -u libmagic.orig/apprentice.c libmagic/apprentice.c sizeof(struct magic_set)))) == NULL) return NULL; -@@ -479,7 +472,7 @@ +@@ -485,7 +478,7 @@ ms->o.buf = ms->o.pbuf = NULL; len = (ms->c.len = 10) * sizeof(*ms->c.li); @@ -171,7 +171,7 @@ diff -u libmagic.orig/apprentice.c libmagic/apprentice.c goto free; ms->event_flags = 0; -@@ -490,7 +483,7 @@ +@@ -496,7 +489,7 @@ ms->line = 0; return ms; free: @@ -180,7 +180,7 @@ diff -u libmagic.orig/apprentice.c libmagic/apprentice.c return NULL; } -@@ -499,22 +492,26 @@ +@@ -505,22 +498,26 @@ { if (map == NULL) return; @@ -217,7 +217,7 @@ diff -u libmagic.orig/apprentice.c libmagic/apprentice.c return NULL; } mlist->next = mlist->prev = mlist; -@@ -533,10 +530,10 @@ +@@ -539,10 +536,10 @@ struct mlist *next = ml->next; if (ml->map) apprentice_unmap(ml->map); @@ -230,11 +230,10 @@ diff -u libmagic.orig/apprentice.c libmagic/apprentice.c } /* const char *fn: list of magic files and directories */ -@@ -546,13 +543,28 @@ - char *p, *mfn; - int file_err, errs = -1; - size_t i; -- +@@ -555,12 +552,28 @@ + + file_reset(ms); + +/* XXX disabling default magic loading so the compiled in data is used */ +#if 0 if ((fn = magic_getpath(fn, action)) == NULL) @@ -261,7 +260,7 @@ diff -u libmagic.orig/apprentice.c libmagic/apprentice.c file_oomem(ms, strlen(fn)); return -1; } -@@ -567,7 +579,7 @@ +@@ -575,7 +588,7 @@ mlist_free(ms->mlist[i]); while (i != 0); } @@ -270,7 +269,7 @@ diff -u libmagic.orig/apprentice.c libmagic/apprentice.c return -1; } } -@@ -584,7 +596,7 @@ +@@ -592,7 +605,7 @@ fn = p; } @@ -279,18 +278,18 @@ diff -u libmagic.orig/apprentice.c libmagic/apprentice.c if (errs == -1) { for (i = 0; i < MAGIC_SETS; i++) { -@@ -904,7 +916,7 @@ +@@ -918,7 +931,7 @@ - maxmagic[i] += ALLOC_INCR; + mset[i].max += ALLOC_INCR; if ((mp = CAST(struct magic_entry *, -- realloc(mentry[i], sizeof(*mp) * maxmagic[i]))) == -+ erealloc(mentry[i], sizeof(*mp) * maxmagic[i]))) == +- realloc(mset[i].me, sizeof(*mp) * mset[i].max))) == ++ erealloc(mset[i].me, sizeof(*mp) * mset[i].max))) == NULL) { - file_oomem(ms, sizeof(*mp) * maxmagic[i]); + file_oomem(ms, sizeof(*mp) * mset[i].max); return -1; -@@ -925,13 +937,24 @@ +@@ -939,13 +952,20 @@ load_1(struct magic_set *ms, int action, const char *fn, int *errs, - struct magic_entry **mentry, uint32_t *mentrycount) + struct magic_entry_set *mset) { - size_t lineno = 0, llen = 0; + char buffer[BUFSIZ + 1]; @@ -307,17 +306,13 @@ diff -u libmagic.orig/apprentice.c libmagic/apprentice.c + TSRMLS_FETCH(); + + ms->file = fn; -+#if PHP_API_VERSION < 20100412 -+ stream = php_stream_open_wrapper((char *)fn, "rb", REPORT_ERRORS|ENFORCE_SAFE_MODE, NULL); -+#else + stream = php_stream_open_wrapper((char *)fn, "rb", REPORT_ERRORS, NULL); -+#endif + + if (stream == NULL) { if (errno != ENOENT) file_error(ms, errno, "cannot read magic file `%s'", fn); -@@ -941,8 +964,7 @@ +@@ -955,8 +975,7 @@ memset(&me, 0, sizeof(me)); /* read and parse this file */ @@ -327,25 +322,17 @@ diff -u libmagic.orig/apprentice.c libmagic/apprentice.c if (len == 0) /* null line, garbage, etc */ continue; if (line[len - 1] == '\n') { -@@ -994,14 +1016,13 @@ - goto again; - default: - (*errs)++; -- break; -- } -+ break; - } +@@ -1014,8 +1033,7 @@ } -+ } if (me.mp) - (void)addentry(ms, &me, mentry, mentrycount); + (void)addentry(ms, &me, mset); - free(line); - (void)fclose(f); + php_stream_close(stream); } /* -@@ -1080,7 +1101,7 @@ +@@ -1094,7 +1112,7 @@ mentrycount += me[i].cont_count; slen = sizeof(**ma) * mentrycount; @@ -354,7 +341,7 @@ diff -u libmagic.orig/apprentice.c libmagic/apprentice.c file_oomem(ms, slen); return -1; } -@@ -1102,27 +1123,29 @@ +@@ -1116,8 +1134,8 @@ if (me == NULL) return; for (i = 0; i < nme; i++) @@ -365,46 +352,34 @@ diff -u libmagic.orig/apprentice.c libmagic/apprentice.c } private struct magic_map * - apprentice_load(struct magic_set *ms, const char *fn, int action) - { -- int errs = 0; -+ int errs = 0; - struct magic_entry *mentry[MAGIC_SETS] = { NULL }; - uint32_t mentrycount[MAGIC_SETS] = { 0 }; +@@ -1126,18 +1144,20 @@ + int errs = 0; uint32_t i, j; size_t files = 0, maxfiles = 0; - char **filearr = NULL, *mfn; + char **filearr = NULL; struct stat st; struct magic_map *map; + struct magic_entry_set mset[MAGIC_SETS]; - DIR *dir; - struct dirent *d; + php_stream *dir; + php_stream_dirent d; -+ ++ + TSRMLS_FETCH(); + memset(mset, 0, sizeof(mset)); ms->flags |= MAGIC_CHECK; /* Enable checks for parsed files */ -- if ((map = CAST(struct magic_map *, calloc(1, sizeof(*map)))) == NULL) { -+ if ((map = CAST(struct magic_map *, ecalloc(1, sizeof(*map)))) == NULL) { + +- if ((map = CAST(struct magic_map *, calloc(1, sizeof(*map)))) == NULL) ++ if ((map = CAST(struct magic_map *, ecalloc(1, sizeof(*map)))) == NULL) + { file_oomem(ms, sizeof(*map)); return NULL; - } -@@ -1131,23 +1154,37 @@ - if (action == FILE_CHECK) +@@ -1148,22 +1168,26 @@ (void)fprintf(stderr, "%s\n", usg_hdr); -+ { -+ /* XXX the maxmagic has to be reset each time we load some new magic file. -+ Where file commando is used it's not essential as the CLI process -+ ends, multiple loading within the same process wouldn't work. */ -+ int k; -+ for (k = 0; k < MAGIC_SETS; k++) { -+ maxmagic[k] = 0; -+ } -+ } -+ /* load directory or file */ - if (stat(fn, &st) == 0 && S_ISDIR(st.st_mode)) { - dir = opendir(fn); @@ -436,7 +411,7 @@ diff -u libmagic.orig/apprentice.c libmagic/apprentice.c continue; } if (files >= maxfiles) { -@@ -1155,24 +1192,23 @@ +@@ -1171,23 +1195,23 @@ maxfiles = (maxfiles + 1) * 2; mlen = maxfiles * sizeof(*filearr); if ((filearr = CAST(char **, @@ -445,6 +420,7 @@ diff -u libmagic.orig/apprentice.c libmagic/apprentice.c file_oomem(ms, mlen); - free(mfn); - closedir(dir); ++ efree(mfn); + php_stream_closedir(dir); errs++; goto out; @@ -457,17 +433,16 @@ diff -u libmagic.orig/apprentice.c libmagic/apprentice.c + php_stream_closedir(dir); qsort(filearr, files, sizeof(*filearr), cmpstrp); for (i = 0; i < files; i++) { - load_1(ms, action, filearr[i], &errs, mentry, - mentrycount); + load_1(ms, action, filearr[i], &errs, mset); - free(filearr[i]); + efree(filearr[i]); } - free(filearr); + efree(filearr); } else - load_1(ms, action, fn, &errs, mentry, mentrycount); + load_1(ms, action, fn, &errs, mset); if (errs) -@@ -1211,9 +1247,9 @@ +@@ -1226,9 +1250,9 @@ if (errs) { for (j = 0; j < MAGIC_SETS; j++) { if (map->magic[j]) @@ -479,7 +454,7 @@ diff -u libmagic.orig/apprentice.c libmagic/apprentice.c return NULL; } return map; -@@ -1500,7 +1536,7 @@ +@@ -1516,7 +1540,7 @@ if (me->cont_count == me->max_count) { struct magic *nm; size_t cnt = me->max_count + ALLOC_CHUNK; @@ -488,7 +463,7 @@ diff -u libmagic.orig/apprentice.c libmagic/apprentice.c sizeof(*nm) * cnt))) == NULL) { file_oomem(ms, sizeof(*nm) * cnt); return -1; -@@ -1515,7 +1551,7 @@ +@@ -1531,7 +1555,7 @@ static const size_t len = sizeof(*m) * ALLOC_CHUNK; if (me->mp != NULL) return 1; @@ -497,7 +472,7 @@ diff -u libmagic.orig/apprentice.c libmagic/apprentice.c file_oomem(ms, len); return -1; } -@@ -1688,7 +1724,7 @@ +@@ -1704,7 +1728,7 @@ m->type = get_standard_integer_type(l, &l); else if (*l == 's' && !isalpha((unsigned char)l[1])) { m->type = FILE_STRING; @@ -506,18 +481,18 @@ diff -u libmagic.orig/apprentice.c libmagic/apprentice.c } } } -@@ -1701,6 +1737,10 @@ +@@ -1717,6 +1741,10 @@ if (m->type == FILE_INVALID) { if (ms->flags & MAGIC_CHECK) file_magwarn(ms, "type `%s' invalid", l); -+ if (me->mp) { ++ /*if (me->mp) { + efree(me->mp); + me->mp = NULL; -+ } ++ }*/ return -1; } -@@ -1709,7 +1749,7 @@ +@@ -1725,7 +1753,7 @@ m->mask_op = 0; if (*l == '~') { @@ -526,7 +501,7 @@ diff -u libmagic.orig/apprentice.c libmagic/apprentice.c m->mask_op |= FILE_OPINVERSE; else if (ms->flags & MAGIC_CHECK) file_magwarn(ms, "'~' invalid for string types"); -@@ -1718,7 +1758,7 @@ +@@ -1734,7 +1762,7 @@ m->str_range = 0; m->str_flags = m->type == FILE_PSTRING ? PSTRING_1_LE : 0; if ((op = get_op(*l)) != -1) { @@ -535,7 +510,7 @@ diff -u libmagic.orig/apprentice.c libmagic/apprentice.c uint64_t val; ++l; m->mask_op |= op; -@@ -1909,11 +1949,6 @@ +@@ -1925,11 +1953,6 @@ if (check_format(ms, m) == -1) return -1; } @@ -547,7 +522,7 @@ diff -u libmagic.orig/apprentice.c libmagic/apprentice.c m->mimetype[0] = '\0'; /* initialise MIME type to none */ return 0; } -@@ -2554,59 +2589,80 @@ +@@ -2575,59 +2598,76 @@ private struct magic_map * apprentice_map(struct magic_set *ms, const char *fn) { @@ -561,12 +536,12 @@ diff -u libmagic.orig/apprentice.c libmagic/apprentice.c size_t i; + php_stream *stream = NULL; + php_stream_statbuf st; ++ ++ ++ TSRMLS_FETCH(); - fd = -1; - if ((map = CAST(struct magic_map *, calloc(1, sizeof(*map)))) == NULL) { -+ -+ TSRMLS_FETCH(); -+ + if ((map = CAST(struct magic_map *, ecalloc(1, sizeof(*map)))) == NULL) { file_oomem(ms, sizeof(*map)); + efree(map); @@ -593,11 +568,7 @@ diff -u libmagic.orig/apprentice.c libmagic/apprentice.c goto error; - if ((fd = open(dbname, O_RDONLY|O_BINARY)) == -1) -+#if PHP_API_VERSION < 20100412 -+ stream = php_stream_open_wrapper((char *)fn, "rb", REPORT_ERRORS|ENFORCE_SAFE_MODE, NULL); -+#else + stream = php_stream_open_wrapper((char *)fn, "rb", REPORT_ERRORS, NULL); -+#endif + + if (!stream) { goto error; @@ -649,7 +620,7 @@ diff -u libmagic.orig/apprentice.c libmagic/apprentice.c if (*ptr != MAGICNO) { if (swap4(*ptr) != MAGICNO) { file_error(ms, 0, "bad magic in `%s'", dbname); -@@ -2620,17 +2676,29 @@ +@@ -2641,17 +2681,29 @@ else version = ptr[1]; if (version != VERSIONNO) { @@ -687,7 +658,7 @@ diff -u libmagic.orig/apprentice.c libmagic/apprentice.c } map->magic[0] = CAST(struct magic *, map->p) + 1; nentries = 0; -@@ -2643,22 +2711,29 @@ +@@ -2664,22 +2716,29 @@ map->magic[i + 1] = map->magic[i] + map->nmagic[i]; nentries += map->nmagic[i]; } @@ -722,7 +693,7 @@ diff -u libmagic.orig/apprentice.c libmagic/apprentice.c return NULL; } -@@ -2679,14 +2754,23 @@ +@@ -2700,14 +2759,19 @@ char *dbname; int rv = -1; uint32_t i; @@ -738,18 +709,14 @@ diff -u libmagic.orig/apprentice.c libmagic/apprentice.c - if ((fd = open(dbname, O_WRONLY|O_CREAT|O_TRUNC|O_BINARY, 0644)) == -1) - { -+/* wb+ == O_WRONLY|O_CREAT|O_TRUNC|O_BINARY */ -+#if PHP_API_VERSION < 20100412 -+ stream = php_stream_open_wrapper((char *)fn, "wb+", REPORT_ERRORS|ENFORCE_SAFE_MODE, NULL); -+#else ++ /* wb+ == O_WRONLY|O_CREAT|O_TRUNC|O_BINARY */ + stream = php_stream_open_wrapper((char *)fn, "wb+", REPORT_ERRORS, NULL); -+#endif + + if (!stream) { file_error(ms, errno, "cannot open `%s'", dbname); goto out; } -@@ -2696,31 +2780,33 @@ +@@ -2717,31 +2781,33 @@ goto out; } @@ -789,7 +756,7 @@ diff -u libmagic.orig/apprentice.c libmagic/apprentice.c return rv; } -@@ -2733,6 +2819,7 @@ +@@ -2754,6 +2820,7 @@ { const char *p, *q; char *buf; @@ -797,7 +764,7 @@ diff -u libmagic.orig/apprentice.c libmagic/apprentice.c if (strip) { if ((p = strrchr(fn, '/')) != NULL) -@@ -2754,16 +2841,18 @@ +@@ -2775,16 +2842,18 @@ q++; /* Compatibility with old code that looked in .mime */ if (ms->flags & MAGIC_MIME) { @@ -822,7 +789,7 @@ diff -u libmagic.orig/apprentice.c libmagic/apprentice.c /* Compatibility with old code that looked in .mime */ if (strstr(p, ".mime") != NULL) -@@ -2853,7 +2942,7 @@ +@@ -2874,7 +2943,7 @@ m->offset = swap4((uint32_t)m->offset); m->in_offset = swap4((uint32_t)m->in_offset); m->lineno = swap4((uint32_t)m->lineno); @@ -832,8 +799,8 @@ diff -u libmagic.orig/apprentice.c libmagic/apprentice.c m->str_flags = swap4(m->str_flags); } diff -u libmagic.orig/ascmagic.c libmagic/ascmagic.c ---- libmagic.orig/ascmagic.c Wed Oct 31 18:03:01 2012 -+++ libmagic/ascmagic.c Mon Mar 10 16:40:55 2014 +--- libmagic.orig/ascmagic.c Thu Feb 13 00:20:53 2014 ++++ libmagic/ascmagic.c Fri Feb 21 00:21:27 2014 @@ -139,7 +139,7 @@ /* malloc size is a conservative overestimate; could be improved, or at least realloced after conversion. */ @@ -843,24 +810,7 @@ diff -u libmagic.orig/ascmagic.c libmagic/ascmagic.c file_oomem(ms, mlen); goto done; } -@@ -147,7 +147,7 @@ - == NULL) - goto done; - if ((rv = file_softmagic(ms, utf8_buf, -- (size_t)(utf8_end - utf8_buf), TEXTTEST, text)) == 0) -+ (size_t)(utf8_end - utf8_buf), 0, TEXTTEST, text)) == 0) - rv = -1; - } - -@@ -211,6 +211,7 @@ - case 0: - if (file_printf(ms, ", ") == -1) - goto done; -+ break; - case -1: - goto done; - default: -@@ -296,7 +297,8 @@ +@@ -297,7 +297,8 @@ } rv = 1; done: @@ -871,8 +821,8 @@ diff -u libmagic.orig/ascmagic.c libmagic/ascmagic.c return rv; } diff -u libmagic.orig/cdf.c libmagic/cdf.c ---- libmagic.orig/cdf.c Thu Mar 21 18:45:14 2013 -+++ libmagic/cdf.c Tue May 27 22:22:35 2014 +--- libmagic.orig/cdf.c Tue Feb 26 17:20:42 2013 ++++ libmagic/cdf.c Tue May 27 22:28:51 2014 @@ -43,7 +43,17 @@ #include <err.h> #endif @@ -990,8 +940,8 @@ diff -u libmagic.orig/cdf.c libmagic/cdf.c (void)fprintf(stderr, "timestamp %s\n", buf); } else { diff -u libmagic.orig/cdf.h libmagic/cdf.h ---- libmagic.orig/cdf.h Wed Oct 31 18:03:01 2012 -+++ libmagic/cdf.h Mon Dec 2 15:25:29 2013 +--- libmagic.orig/cdf.h Thu Jun 21 00:19:55 2012 ++++ libmagic/cdf.h Tue May 27 22:28:51 2014 @@ -35,10 +35,12 @@ #ifndef _H_CDF_ #define _H_CDF_ @@ -1033,8 +983,8 @@ diff -u libmagic.orig/cdf.h libmagic/cdf.h void cdf_swap_header(cdf_header_t *); void cdf_unpack_header(cdf_header_t *, char *); diff -u libmagic.orig/cdf_time.c libmagic/cdf_time.c ---- libmagic.orig/cdf_time.c Wed Oct 31 18:03:01 2012 -+++ libmagic/cdf_time.c Mon Dec 2 15:25:29 2013 +--- libmagic.orig/cdf_time.c Thu Jun 21 00:18:33 2012 ++++ libmagic/cdf_time.c Fri Feb 21 00:21:27 2014 @@ -96,7 +96,7 @@ } @@ -1093,8 +1043,8 @@ diff -u libmagic.orig/cdf_time.c libmagic/cdf_time.c static const cdf_timestamp_t tst = 0x01A5E403C2D59C00ULL; static const char *ref = "Sat Apr 23 01:30:00 1977"; diff -u libmagic.orig/compress.c libmagic/compress.c ---- libmagic.orig/compress.c Sun Jan 6 21:35:43 2013 -+++ libmagic/compress.c Mon Dec 2 15:25:29 2013 +--- libmagic.orig/compress.c Sun Jan 5 16:55:21 2014 ++++ libmagic/compress.c Fri Feb 21 00:21:27 2014 @@ -32,6 +32,7 @@ * uncompress(method, old, n, newch) - uncompress old into new, * using method, return sizeof new @@ -1123,7 +1073,7 @@ diff -u libmagic.orig/compress.c libmagic/compress.c private const struct { const char magic[8]; size_t maglen; -@@ -85,8 +90,7 @@ +@@ -86,8 +91,7 @@ #define NODATA ((size_t)~0) private ssize_t swrite(int, const void *, size_t); @@ -1133,7 +1083,7 @@ diff -u libmagic.orig/compress.c libmagic/compress.c private size_t uncompressbuf(struct magic_set *, int, size_t, const unsigned char *, unsigned char **, size_t); #ifdef BUILTIN_DECOMPRESS -@@ -102,10 +106,13 @@ +@@ -103,10 +107,13 @@ size_t i, nsz; int rv = 0; int mime = ms->flags & MAGIC_MIME; @@ -1147,7 +1097,7 @@ diff -u libmagic.orig/compress.c libmagic/compress.c for (i = 0; i < ncompr; i++) { if (nbytes < compr[i].maglen) continue; -@@ -134,7 +141,8 @@ +@@ -133,7 +140,8 @@ } } error: @@ -1157,7 +1107,7 @@ diff -u libmagic.orig/compress.c libmagic/compress.c ms->flags |= MAGIC_COMPRESS; return rv; } -@@ -168,7 +176,7 @@ +@@ -167,7 +175,7 @@ * `safe' read for sockets and pipes. */ protected ssize_t @@ -1166,7 +1116,7 @@ diff -u libmagic.orig/compress.c libmagic/compress.c { ssize_t rv; #ifdef FIONREAD -@@ -216,7 +224,7 @@ +@@ -215,7 +223,7 @@ nocheck: do @@ -1175,7 +1125,7 @@ diff -u libmagic.orig/compress.c libmagic/compress.c case -1: if (errno == EINTR) continue; -@@ -293,13 +301,14 @@ +@@ -292,13 +300,14 @@ return -1; } (void)close(tfd); @@ -1192,7 +1142,7 @@ diff -u libmagic.orig/compress.c libmagic/compress.c #ifdef BUILTIN_DECOMPRESS #define FHCRC (1 << 1) -@@ -336,7 +345,7 @@ +@@ -335,7 +344,7 @@ if (data_start >= n) return 0; @@ -1201,7 +1151,7 @@ diff -u libmagic.orig/compress.c libmagic/compress.c return 0; } -@@ -397,19 +406,16 @@ +@@ -396,19 +405,16 @@ case 0: /* child */ (void) close(0); if (fd != -1) { @@ -1225,7 +1175,7 @@ diff -u libmagic.orig/compress.c libmagic/compress.c (void) close(fdout[0]); (void) close(fdout[1]); #ifndef DEBUG -@@ -466,20 +472,14 @@ +@@ -465,20 +471,14 @@ fdin[1] = -1; } @@ -1247,17 +1197,17 @@ diff -u libmagic.orig/compress.c libmagic/compress.c - free(*newch); + efree(*newch); n = 0; - newch[0] = '\0'; + *newch = NULL; goto err; -@@ -503,4 +503,4 @@ +@@ -502,4 +502,4 @@ return n; } } -#endif +#endif /* if PHP_FILEINFO_UNCOMPRESS */ diff -u libmagic.orig/file.h libmagic/file.h ---- libmagic.orig/file.h Mon Feb 18 16:40:59 2013 -+++ libmagic/file.h Mon Mar 10 16:40:55 2014 +--- libmagic.orig/file.h Thu Feb 13 00:20:53 2014 ++++ libmagic/file.h Fri Feb 21 00:21:27 2014 @@ -33,11 +33,9 @@ #ifndef __file_h__ #define __file_h__ @@ -1317,34 +1267,16 @@ diff -u libmagic.orig/file.h libmagic/file.h #ifndef MIN #define MIN(a,b) (((a) < (b)) ? (a) : (b)) #endif -@@ -224,7 +226,7 @@ - #define FILE_USE 46 - #define FILE_NAMES_SIZE 47 /* size of array to contain all names */ +@@ -225,7 +227,7 @@ + #define FILE_CLEAR 47 + #define FILE_NAMES_SIZE 48 /* size of array to contain all names */ -#define IS_STRING(t) \ +#define IS_LIBMAGIC_STRING(t) \ ((t) == FILE_STRING || \ (t) == FILE_PSTRING || \ (t) == FILE_BESTRING16 || \ -@@ -248,7 +250,7 @@ - #ifdef ENABLE_CONDITIONALS - uint8_t cond; /* conditional type */ - #else -- uint8_t dummy; -+ uint8_t dummy; - #endif - uint8_t factor_op; - #define FILE_FACTOR_OP_PLUS '+' -@@ -347,7 +349,7 @@ - /* list of magic entries */ - struct mlist { - struct magic *magic; /* array of magic entries */ -- uint32_t nmagic; /* number of entries in array */ -+ uint32_t nmagic; /* number of entries in array */ - void *map; /* internal resources used by entry */ - struct mlist *next, *prev; - }; -@@ -411,21 +413,18 @@ +@@ -411,22 +413,18 @@ protected const char *file_fmttime(uint64_t, int, char *); protected struct magic_set *file_ms_alloc(int); protected void file_ms_free(struct magic_set *); @@ -1354,7 +1286,8 @@ diff -u libmagic.orig/file.h libmagic/file.h -protected int file_fsmagic(struct magic_set *, const char *, struct stat *); +protected int file_fsmagic(struct magic_set *, const char *, struct stat *, php_stream *); protected int file_pipe2file(struct magic_set *, int, const void *, size_t); --protected int file_vprintf(struct magic_set *, const char *, va_list); +-protected int file_vprintf(struct magic_set *, const char *, va_list) +- __attribute__((__format__(__printf__, 2, 0))); -protected size_t file_printedlen(const struct magic_set *); protected int file_replace(struct magic_set *, const char *, const char *); -protected int file_printf(struct magic_set *, const char *, ...) @@ -1366,17 +1299,11 @@ diff -u libmagic.orig/file.h libmagic/file.h protected int file_trycdf(struct magic_set *, int, const unsigned char *, size_t); -#if HAVE_FORK -+#ifdef PHP_FILEINFO_UNCOMPRESS ++#ifdef PHP_FILEINFO_UNCOMPRESS protected int file_zmagic(struct magic_set *, int, const char *, const unsigned char *, size_t); #endif -@@ -438,21 +437,18 @@ - unichar **, size_t *, const char **, const char **, const char **); - protected int file_is_tar(struct magic_set *, const unsigned char *, size_t); - protected int file_softmagic(struct magic_set *, const unsigned char *, size_t, -- int, int); -+ size_t, int, int); - protected int file_apprentice(struct magic_set *, const char *, int); +@@ -444,16 +442,13 @@ protected int file_magicfind(struct magic_set *, const char *, struct mlist *); protected uint64_t file_signextend(struct magic_set *, struct magic *, uint64_t); @@ -1397,7 +1324,7 @@ diff -u libmagic.orig/file.h libmagic/file.h protected void file_showstr(FILE *, const char *, size_t); protected size_t file_mbswidth(const char *); protected const char *file_getbuffer(struct magic_set *); -@@ -462,16 +458,14 @@ +@@ -463,16 +458,14 @@ size_t *); protected size_t file_pstring_length_size(const struct magic *); protected size_t file_pstring_get_length(const struct magic *, const char *); @@ -1415,7 +1342,7 @@ diff -u libmagic.orig/file.h libmagic/file.h #ifndef HAVE_STRERROR extern int sys_nerr; -@@ -484,32 +478,16 @@ +@@ -485,20 +478,10 @@ #define strtoul(a, b, c) strtol(a, b, c) #endif @@ -1426,31 +1353,19 @@ diff -u libmagic.orig/file.h libmagic/file.h -int vasprintf(char **, const char *, va_list); -#endif -#ifndef HAVE_ASPRINTF --int asprintf(char **ptr, const char *format_string, ...); +-int asprintf(char **, const char *, ...); -#endif - -#ifndef HAVE_STRLCPY +#ifndef strlcpy - size_t strlcpy(char *dst, const char *src, size_t siz); + size_t strlcpy(char *, const char *, size_t); #endif -#ifndef HAVE_STRLCAT +#ifndef strlcat - size_t strlcat(char *dst, const char *src, size_t siz); - #endif - #ifndef HAVE_GETLINE - ssize_t getline(char **dst, size_t *len, FILE *fp); - ssize_t getdelim(char **dst, size_t *len, int delimiter, FILE *fp); + size_t strlcat(char *, const char *, size_t); #endif --#ifndef HAVE_CTIME_R --char *ctime_r(const time_t *, char *); --#endif --#ifndef HAVE_ASCTIME_R --char *asctime_r(const struct tm *, char *); --#endif - - #if defined(HAVE_MMAP) && defined(HAVE_SYS_MMAN_H) && !defined(QUICK) - #define QUICK -@@ -531,6 +509,14 @@ + #ifndef HAVE_STRCASESTR +@@ -535,6 +518,14 @@ #endif #else #define FILE_RCSID(id) @@ -1466,8 +1381,8 @@ diff -u libmagic.orig/file.h libmagic/file.h #endif /* __file_h__ */ diff -u libmagic.orig/fsmagic.c libmagic/fsmagic.c ---- libmagic.orig/fsmagic.c Thu Mar 21 18:45:14 2013 -+++ libmagic/fsmagic.c Mon Dec 2 15:25:29 2013 +--- libmagic.orig/fsmagic.c Sun Dec 1 20:22:13 2013 ++++ libmagic/fsmagic.c Fri Feb 21 00:21:27 2014 @@ -59,27 +59,21 @@ # define minor(dev) ((dev) & 0xff) #endif @@ -1496,7 +1411,7 @@ diff -u libmagic.orig/fsmagic.c libmagic/fsmagic.c +#ifdef PHP_WIN32 + +# undef S_IFIFO -+#endif + #endif + + +#ifndef S_ISDIR @@ -1505,12 +1420,12 @@ diff -u libmagic.orig/fsmagic.c libmagic/fsmagic.c + +#ifndef S_ISREG +#define S_ISREG(mode) ((mode) & _S_IFREG) - #endif ++#endif + private int handle_mime(struct magic_set *ms, int mime, const char *str) { -@@ -96,49 +90,45 @@ +@@ -96,42 +90,39 @@ } protected int @@ -1558,7 +1473,7 @@ diff -u libmagic.orig/fsmagic.c libmagic/fsmagic.c + file_error(ms, errno, "cannot stat `%s'", fn); + return -1; + } -+ return 1; ++ return 0; + } + memcpy(sb, &ssb.sb, sizeof(struct stat)); + } else { @@ -1567,24 +1482,16 @@ diff -u libmagic.orig/fsmagic.c libmagic/fsmagic.c + file_error(ms, errno, "cannot stat `%s'", fn); + return -1; + } -+ return 1; ++ return 0; } - if (file_printf(ms, "cannot open `%s' (%s)", - fn, strerror(errno)) == -1) - return -1; -- ms->event_flags |= EVENT_HAD_ERR; -- return -1; +- return 0; } ret = 1; - if (!mime) { - #ifdef S_ISUID -- if (sb->st_mode & S_ISUID) -+ if (sb->st_mode & S_ISUID) - if (file_printf(ms, "%ssetuid", COMMA) == -1) - return -1; - #endif -@@ -155,82 +145,43 @@ +@@ -154,30 +145,24 @@ } switch (sb->st_mode & S_IFMT) { @@ -1625,31 +1532,18 @@ diff -u libmagic.orig/fsmagic.c libmagic/fsmagic.c + break; + } + if (mime) { -+ if (handle_mime(ms, mime, "x-character-device") == -1) ++ if (handle_mime(ms, mime, "chardevice") == -1) + return -1; + } else { +# ifdef HAVE_STAT_ST_RDEV +# ifdef dv_unit if (file_printf(ms, "%scharacter special (%d/%d/%d)", COMMA, major(sb->st_rdev), dv_unit(sb->st_rdev), -- dv_subunit(sb->st_rdev)) == -1) -- return -1; --# else -+ dv_subunit(sb->st_rdev)) == -1) -+ return -1; -+# else - if (file_printf(ms, "%scharacter special (%ld/%ld)", - COMMA, (long)major(sb->st_rdev), - (long)minor(sb->st_rdev)) == -1) -- return -1; --# endif --#else -+ return -1; -+# endif -+# else + dv_subunit(sb->st_rdev)) == -1) +@@ -192,44 +177,11 @@ if (file_printf(ms, "%scharacter special", COMMA) == -1) -- return -1; --#endif + return -1; + #endif - } - break; -#endif @@ -1679,24 +1573,22 @@ diff -u libmagic.orig/fsmagic.c libmagic/fsmagic.c - COMMA, (long)major(sb->st_rdev), - (long)minor(sb->st_rdev)) == -1) - return -1; -+ return -1; -+# endif -+ } ++ } + return 1; # endif -#else - if (file_printf(ms, "%sblock special", COMMA) == -1) - return -1; - #endif +-#endif - } - break; --#endif + #endif - /* TODO add code to handle V7 MUX and Blit MUX files */ + #ifdef S_IFIFO case S_IFIFO: if((ms->flags & MAGIC_DEVICES) != 0) -@@ -253,79 +204,14 @@ +@@ -252,79 +204,14 @@ #endif #ifdef S_IFLNK case S_IFLNK: @@ -1780,26 +1672,7 @@ diff -u libmagic.orig/fsmagic.c libmagic/fsmagic.c #ifdef S_IFSOCK #ifndef __COHERENT__ case S_IFSOCK: -@@ -337,27 +223,27 @@ - break; - #endif - #endif -- case S_IFREG: -- /* -- * regular file, check next possibility -- * -- * If stat() tells us the file has zero length, report here that -- * the file is empty, so we can skip all the work of opening and -- * reading the file. -+ case S_IFREG: -+ /* -+ * regular file, check next possibility -+ * -+ * If stat() tells us the file has zero length, report here that -+ * the file is empty, so we can skip all the work of opening and -+ * reading the file. - * But if the -s option has been given, we skip this - * optimization, since on some systems, stat() reports zero +@@ -348,15 +235,15 @@ * size for raw disk partitions. (If the block special device * really has zero length, the fact that it is empty will be * detected and reported correctly when we read the file.) @@ -1822,94 +1695,104 @@ diff -u libmagic.orig/fsmagic.c libmagic/fsmagic.c ret = 0; break; -@@ -367,9 +253,5 @@ +@@ -366,9 +253,5 @@ /*NOTREACHED*/ } -- if (!mime && did) { +- if (!mime && did && ret == 0) { - if (file_printf(ms, " ") == -1) - return -1; - } return ret; } diff -u libmagic.orig/funcs.c libmagic/funcs.c ---- libmagic.orig/funcs.c Wed Oct 31 18:03:01 2012 -+++ libmagic/funcs.c Mon Mar 10 16:40:55 2014 -@@ -41,52 +41,42 @@ +--- libmagic.orig/funcs.c Thu Feb 13 00:20:53 2014 ++++ libmagic/funcs.c Wed Mar 19 13:28:34 2014 +@@ -41,79 +41,79 @@ #if defined(HAVE_WCTYPE_H) #include <wctype.h> #endif -#if defined(HAVE_LIMITS_H) -#include <limits.h> -+ -+#ifndef SIZE_MAX -+# define SIZE_MAX ((size_t) -1) +-#endif + #if defined(HAVE_LOCALE_H) + #include <locale.h> #endif --#ifndef SIZE_MAX + #ifndef SIZE_MAX -#define SIZE_MAX ((size_t)~0) -+#ifndef PREG_OFFSET_CAPTURE -+# define PREG_OFFSET_CAPTURE (1<<8) ++# define SIZE_MAX ((size_t) -1) #endif -+extern public void convert_libmagic_pattern(zval *pattern, int options); -+ - /* - * Like printf, only we append to a buffer. - */ - protected int +-/* +- * Like printf, only we append to a buffer. +- */ +-protected int -file_vprintf(struct magic_set *ms, const char *fmt, va_list ap) -+file_printf(struct magic_set *ms, const char *fmt, ...) - { -+ va_list ap; - int len; +-{ +- int len; - char *buf, *newstr; -+ char *buf = NULL, *newstr; ++#include "php.h" ++#include "main/php_network.h" +- if (ms->event_flags & EVENT_HAD_ERR) +- return 0; - len = vasprintf(&buf, fmt, ap); - if (len < 0) - goto out; -+ va_start(ap, fmt); -+ len = vspprintf(&buf, 0, fmt, ap); -+ va_end(ap); ++#ifndef PREG_OFFSET_CAPTURE ++# define PREG_OFFSET_CAPTURE (1<<8) ++#endif - if (ms->o.buf != NULL) { +- if (ms->o.buf != NULL) { - len = asprintf(&newstr, "%s%s", ms->o.buf, buf); - free(buf); - if (len < 0) - goto out; - free(ms->o.buf); - buf = newstr; -+ len = spprintf(&newstr, 0, "%s%s", ms->o.buf, (buf ? buf : "")); -+ if (buf) { -+ efree(buf); -+ } -+ efree(ms->o.buf); -+ ms->o.buf = newstr; -+ } else { -+ ms->o.buf = buf; - } +- } - ms->o.buf = buf; - return 0; +- return 0; -out: - file_error(ms, errno, "vasprintf failed"); - return -1; -} -- --protected int --file_printf(struct magic_set *ms, const char *fmt, ...) --{ ++extern public void convert_libmagic_pattern(zval *pattern, int options); + + protected int + file_printf(struct magic_set *ms, const char *fmt, ...) + { - int rv; -- va_list ap; -- -- va_start(ap, fmt); + va_list ap; ++ int len; ++ char *buf = NULL, *newstr; + + va_start(ap, fmt); - rv = file_vprintf(ms, fmt, ap); -- va_end(ap); ++ len = vspprintf(&buf, 0, fmt, ap); + va_end(ap); - return rv; ++ ++ if (ms->o.buf != NULL) { ++ len = spprintf(&newstr, 0, "%s%s", ms->o.buf, (buf ? buf : "")); ++ if (buf) { ++ efree(buf); ++ } ++ efree(ms->o.buf); ++ ms->o.buf = newstr; ++ } else { ++ ms->o.buf = buf; ++ } ++ return 0; } /* -@@ -97,17 +87,30 @@ + * error - print best error message possible + */ + /*VARARGS*/ +-__attribute__((__format__(__printf__, 3, 0))) + private void file_error_core(struct magic_set *ms, int error, const char *f, va_list va, size_t lineno) { @@ -1944,7 +1827,7 @@ diff -u libmagic.orig/funcs.c libmagic/funcs.c ms->event_flags |= EVENT_HAD_ERR; ms->error = error; } -@@ -154,10 +157,9 @@ +@@ -160,10 +160,9 @@ file_error(ms, errno, "error reading"); } @@ -1957,7 +1840,7 @@ diff -u libmagic.orig/funcs.c libmagic/funcs.c { int m = 0, rv = 0, looks_text = 0; int mime = ms->flags & MAGIC_MIME; -@@ -201,10 +203,10 @@ +@@ -203,10 +202,10 @@ } } #endif @@ -1970,8 +1853,8 @@ diff -u libmagic.orig/funcs.c libmagic/funcs.c + if ((m = file_zmagic(ms, stream, inname, ubuf, nb)) != 0) { if ((ms->flags & MAGIC_DEBUG) != 0) (void)fprintf(stderr, "zmagic %d\n", m); - goto done; -@@ -219,16 +221,21 @@ + goto done_encoding; +@@ -221,12 +220,17 @@ } /* Check if we have a CDF file */ @@ -1981,7 +1864,7 @@ diff -u libmagic.orig/funcs.c libmagic/funcs.c - (void)fprintf(stderr, "cdf %d\n", m); - goto done; + if ((ms->flags & MAGIC_NO_CHECK_CDF) == 0) { -+ int fd; ++ php_socket_t fd; + TSRMLS_FETCH(); + if (stream && SUCCESS == php_stream_cast(stream, PHP_STREAM_AS_FD, (void **)&fd, 0)) { + if ((m = file_trycdf(ms, fd, ubuf, nb)) != 0) { @@ -1994,12 +1877,7 @@ diff -u libmagic.orig/funcs.c libmagic/funcs.c /* try soft magic tests */ if ((ms->flags & MAGIC_NO_CHECK_SOFT) == 0) -- if ((m = file_softmagic(ms, ubuf, nb, BINTEST, -+ if ((m = file_softmagic(ms, ubuf, nb, 0, BINTEST, - looks_text)) != 0) { - if ((ms->flags & MAGIC_DEBUG) != 0) - (void)fprintf(stderr, "softmagic %d\n", m); -@@ -296,7 +303,6 @@ +@@ -300,7 +304,6 @@ return m; } @@ -2007,7 +1885,7 @@ diff -u libmagic.orig/funcs.c libmagic/funcs.c protected int file_reset(struct magic_set *ms) -@@ -306,11 +312,11 @@ +@@ -310,11 +313,11 @@ return -1; } if (ms->o.buf) { @@ -2021,7 +1899,7 @@ diff -u libmagic.orig/funcs.c libmagic/funcs.c ms->o.pbuf = NULL; } ms->event_flags &= ~EVENT_HAD_ERR; -@@ -329,7 +335,7 @@ +@@ -333,7 +336,7 @@ protected const char * file_getbuffer(struct magic_set *ms) { @@ -2030,7 +1908,7 @@ diff -u libmagic.orig/funcs.c libmagic/funcs.c size_t psize, len; if (ms->event_flags & EVENT_HAD_ERR) -@@ -344,15 +350,13 @@ +@@ -348,15 +351,13 @@ /* * 4 is for octal representation, + 1 is for NUL */ len = strlen(ms->o.buf); if (len > (SIZE_MAX - 1) / 4) { @@ -2047,7 +1925,7 @@ diff -u libmagic.orig/funcs.c libmagic/funcs.c #if defined(HAVE_WCHAR_H) && defined(HAVE_MBRTOWC) && defined(HAVE_WCWIDTH) { -@@ -412,8 +416,8 @@ +@@ -416,8 +417,8 @@ if (level >= ms->c.len) { len = (ms->c.len += 20) * sizeof(*ms->c.li); ms->c.li = CAST(struct level_info *, (ms->c.li == NULL) ? @@ -2058,17 +1936,15 @@ diff -u libmagic.orig/funcs.c libmagic/funcs.c if (ms->c.li == NULL) { file_oomem(ms, len); return -1; -@@ -433,29 +437,47 @@ +@@ -437,32 +438,50 @@ return ms->o.buf == NULL ? 0 : strlen(ms->o.buf); } -protected int -+ -+protected int file_replace(struct magic_set *ms, const char *pat, const char *rep) { - regex_t rx; -- int rc; +- int rc, rv = -1; + zval *patt; + int opts = 0; + pcre_cache_entry *pce; @@ -2076,6 +1952,25 @@ diff -u libmagic.orig/funcs.c libmagic/funcs.c + zval *repl; + int res_len, rep_cnt = 0; + TSRMLS_FETCH(); + + (void)setlocale(LC_CTYPE, "C"); +- rc = regcomp(&rx, pat, REG_EXTENDED); +- if (rc) { +- char errmsg[512]; +- (void)regerror(rc, &rx, errmsg, sizeof(errmsg)); +- file_magerror(ms, "regex error %d, (%s)", rc, errmsg); +- } else { +- regmatch_t rm; +- int nm = 0; +- while (regexec(&rx, ms->o.buf, 1, &rm, 0) == 0) { +- ms->o.buf[rm.rm_so] = '\0'; +- if (file_printf(ms, "%s%s", rep, +- rm.rm_eo != 0 ? ms->o.buf + rm.rm_eo : "") == -1) +- goto out; +- nm++; +- } +- regfree(&rx); +- rv = nm; + + MAKE_STD_ZVAL(patt); + ZVAL_STRINGL(patt, pat, strlen(pat), 0); @@ -2084,51 +1979,38 @@ diff -u libmagic.orig/funcs.c libmagic/funcs.c + if ((pce = pcre_get_compiled_regex_cache(Z_STRVAL_P(patt), Z_STRLEN_P(patt) TSRMLS_CC)) == NULL) { + zval_dtor(patt); + FREE_ZVAL(patt); -+ return -1; -+ } ++ rep_cnt = -1; ++ goto out; + } + + MAKE_STD_ZVAL(repl); + ZVAL_STRINGL(repl, rep, strlen(rep), 0); + + res = php_pcre_replace_impl(pce, ms->o.buf, strlen(ms->o.buf), repl, + 0, &res_len, -1, &rep_cnt TSRMLS_CC); - -- rc = regcomp(&rx, pat, REG_EXTENDED); -- if (rc) { -- char errmsg[512]; -- (void)regerror(rc, &rx, errmsg, sizeof(errmsg)); -- file_magerror(ms, "regex error %d, (%s)", rc, errmsg); ++ + FREE_ZVAL(repl); + zval_dtor(patt); + FREE_ZVAL(patt); + + if (NULL == res) { - return -1; -- } else { -- regmatch_t rm; -- int nm = 0; -- while (regexec(&rx, ms->o.buf, 1, &rm, 0) == 0) { -- ms->o.buf[rm.rm_so] = '\0'; -- if (file_printf(ms, "%s%s", rep, -- rm.rm_eo != 0 ? ms->o.buf + rm.rm_eo : "") == -1) -- return -1; -- nm++; -- } -- regfree(&rx); -- return nm; - } ++ rep_cnt = -1; ++ goto out; ++ } + + strncpy(ms->o.buf, res, res_len); + ms->o.buf[res_len] = '\0'; + + efree(res); + + out: + (void)setlocale(LC_CTYPE, ""); +- return rv; + return rep_cnt; } -+ diff -u libmagic.orig/magic.c libmagic/magic.c ---- libmagic.orig/magic.c Fri Jan 11 17:43:09 2013 -+++ libmagic/magic.c Mon Dec 2 15:29:02 2013 +--- libmagic.orig/magic.c Sun Dec 1 20:22:13 2013 ++++ libmagic/magic.c Fri Feb 21 00:21:27 2014 @@ -25,11 +25,6 @@ * SUCH DAMAGE. */ @@ -2259,15 +2141,6 @@ diff -u libmagic.orig/magic.c libmagic/magic.c public struct magic_set * magic_open(int flags) -@@ -250,7 +263,7 @@ - magic_load(struct magic_set *ms, const char *magicfile) - { - if (ms == NULL) -- return -1; -+ return -1; - return file_apprentice(ms, magicfile, FILE_LOAD); - } - @@ -262,13 +275,6 @@ return file_apprentice(ms, magicfile, FILE_COMPILE); } @@ -2286,7 +2159,7 @@ diff -u libmagic.orig/magic.c libmagic/magic.c close_and_restore(const struct magic_set *ms, const char *name, int fd, const struct stat *sb) { -- if (fd == STDIN_FILENO) +- if (fd == STDIN_FILENO || name == NULL) - return; - (void) close(fd); @@ -2309,7 +2182,7 @@ diff -u libmagic.orig/magic.c libmagic/magic.c } /* -@@ -332,30 +334,42 @@ +@@ -332,31 +334,42 @@ { if (ms == NULL) return NULL; @@ -2334,6 +2207,7 @@ diff -u libmagic.orig/magic.c libmagic/magic.c struct stat sb; ssize_t nbytes = 0; /* number of bytes read from a datafile */ - int ispipe = 0; +- off_t pos = (off_t)-1; + int no_in_stream = 0; + TSRMLS_FETCH(); + @@ -2358,34 +2232,35 @@ diff -u libmagic.orig/magic.c libmagic/magic.c case -1: /* error */ goto done; case 0: /* nothing found */ -@@ -365,68 +379,48 @@ +@@ -366,74 +379,44 @@ goto done; } - if (inname == NULL) { - if (fstat(fd, &sb) == 0 && S_ISFIFO(sb.st_mode)) - ispipe = 1; +- else +- pos = lseek(fd, (off_t)0, SEEK_CUR); - } else { - int flags = O_RDONLY|O_BINARY; +- int okstat = stat(inname, &sb) == 0; + errno = 0; -- if (stat(inname, &sb) == 0 && S_ISFIFO(sb.st_mode)) { +- if (okstat && S_ISFIFO(sb.st_mode)) { -#ifdef O_NONBLOCK - flags |= O_NONBLOCK; +-#endif +- ispipe = 1; +- } + if (!stream && inname) { + no_in_stream = 1; -+#if PHP_API_VERSION < 20100412 -+ stream = php_stream_open_wrapper((char *)inname, "rb", REPORT_ERRORS|ENFORCE_SAFE_MODE, NULL); -+#else + stream = php_stream_open_wrapper((char *)inname, "rb", REPORT_ERRORS, NULL); - #endif -- ispipe = 1; -- } + } - errno = 0; - if ((fd = open(inname, flags)) < 0) { -- if (unreadable_info(ms, sb.st_mode, inname) == -1) +- if (okstat && +- unreadable_info(ms, sb.st_mode, inname) == -1) - goto done; - rv = 0; + if (!stream) { @@ -2442,6 +2317,8 @@ diff -u libmagic.orig/magic.c libmagic/magic.c rv = 0; done: - free(buf); +- if (pos != (off_t)-1) +- (void)lseek(fd, pos, SEEK_SET); - close_and_restore(ms, inname, fd, &sb); + efree(buf); + @@ -2453,7 +2330,7 @@ diff -u libmagic.orig/magic.c libmagic/magic.c return rv == 0 ? file_getbuffer(ms) : NULL; } -@@ -440,14 +434,13 @@ +@@ -447,14 +430,13 @@ return NULL; /* * The main work is done here! @@ -2471,9 +2348,9 @@ diff -u libmagic.orig/magic.c libmagic/magic.c public const char * magic_error(struct magic_set *ms) diff -u libmagic.orig/magic.h libmagic/magic.h ---- libmagic.orig/magic.h Thu Mar 21 18:52:42 2013 -+++ libmagic/magic.h Mon Dec 2 15:25:29 2013 -@@ -87,6 +87,7 @@ +--- libmagic.orig/magic.h Wed Feb 19 10:53:11 2014 ++++ libmagic/magic.h Fri Feb 21 00:21:27 2014 +@@ -88,6 +88,7 @@ const char *magic_getpath(const char *, int); const char *magic_file(magic_t, const char *); @@ -2481,7 +2358,7 @@ diff -u libmagic.orig/magic.h libmagic/magic.h const char *magic_descriptor(magic_t, int); const char *magic_buffer(magic_t, const void *, size_t); -@@ -96,7 +97,6 @@ +@@ -97,7 +98,6 @@ int magic_version(void); int magic_load(magic_t, const char *); int magic_compile(magic_t, const char *); @@ -2490,8 +2367,8 @@ diff -u libmagic.orig/magic.h libmagic/magic.h int magic_errno(magic_t); diff -u libmagic.orig/print.c libmagic/print.c ---- libmagic.orig/print.c Thu Mar 21 18:45:14 2013 -+++ libmagic/print.c Mon Dec 2 15:29:02 2013 +--- libmagic.orig/print.c Tue Feb 26 19:25:00 2013 ++++ libmagic/print.c Fri Feb 21 00:21:27 2014 @@ -28,13 +28,17 @@ /* * print.c - debugging printout routines @@ -2721,8 +2598,8 @@ diff -u libmagic.orig/print.c libmagic/print.c t = ts.tv_sec; } diff -u libmagic.orig/readcdf.c libmagic/readcdf.c ---- libmagic.orig/readcdf.c Wed Oct 31 18:03:01 2012 -+++ libmagic/readcdf.c Thu Apr 24 19:54:40 2014 +--- libmagic.orig/readcdf.c Tue Jan 7 04:13:42 2014 ++++ libmagic/readcdf.c Tue May 27 22:28:51 2014 @@ -30,7 +30,11 @@ #endif @@ -2735,7 +2612,18 @@ diff -u libmagic.orig/readcdf.c libmagic/readcdf.c #include <string.h> #include <time.h> #include <ctype.h> -@@ -46,12 +50,14 @@ +@@ -69,6 +73,10 @@ + { NULL, NULL, }, + }; + ++#ifdef PHP_WIN32 ++# define strcasestr strstr ++#endif ++ + private const char * + cdf_app_to_mime(const char *vbuf, const struct nv *nv) + { +@@ -91,12 +99,14 @@ { size_t i; cdf_timestamp_t tp; @@ -2751,7 +2639,7 @@ diff -u libmagic.orig/readcdf.c libmagic/readcdf.c for (i = 0; i < count; i++) { cdf_print_property_name(buf, sizeof(buf), info[i].pi_id); switch (info[i].pi_type) { -@@ -125,8 +131,12 @@ +@@ -162,8 +172,12 @@ case CDF_FILETIME: tp = info[i].pi_tp; if (tp != 0) { @@ -2766,39 +2654,23 @@ diff -u libmagic.orig/readcdf.c libmagic/readcdf.c cdf_print_elapsed_time(tbuf, sizeof(tbuf), tp); if (NOTMIME(ms) && file_printf(ms, -@@ -134,9 +144,13 @@ +@@ -171,8 +185,11 @@ return -1; } else { char *c, *ec; - cdf_timestamp_to_timespec(&ts, tp); - c = cdf_ctime(&ts.tv_sec, tbuf); -- if ((ec = strchr(c, '\n')) != NULL) + const time_t sec = ts.tv_sec; + if (cdf_timestamp_to_timespec(&ts, tp) == -1) { + return -1; + } + c = cdf_ctime(&sec, tbuf); -+ if (c != NULL && -+ (ec = strchr(c, '\n')) != NULL) - *ec = '\0'; - - if (NOTMIME(ms) && file_printf(ms, -@@ -314,9 +328,9 @@ - if (file_printf(ms, - "Composite Document File V2 Document") == -1) - return -1; -- if (*expn) -- if (file_printf(ms, ", %s%s", corrupt, expn) == -1) -- return -1; -+ if (*expn) -+ if (file_printf(ms, ", %s%s", corrupt, expn) == -1) -+ return -1; - } else { - if (file_printf(ms, "application/CDFV2-corrupt") == -1) - return -1; + if (c != NULL && + (ec = strchr(c, '\n')) != NULL) + *ec = '\0'; diff -u libmagic.orig/readelf.c libmagic/readelf.c ---- libmagic.orig/readelf.c Thu Mar 21 18:45:14 2013 -+++ libmagic/readelf.c Mon Dec 2 15:25:29 2013 +--- libmagic.orig/readelf.c Tue Nov 5 16:44:01 2013 ++++ libmagic/readelf.c Fri Feb 21 00:21:27 2014 @@ -48,8 +48,8 @@ private int dophn_exec(struct magic_set *, int, int, int, off_t, int, size_t, off_t, int *, int); @@ -2810,7 +2682,7 @@ diff -u libmagic.orig/readelf.c libmagic/readelf.c int, size_t, int *); #define ELF_ALIGN(a) ((((a) + align - 1) / align) * align) -@@ -127,11 +127,17 @@ +@@ -127,7 +127,13 @@ #define elf_getu16(swap, value) getu16(swap, value) #define elf_getu32(swap, value) getu32(swap, value) @@ -2824,35 +2696,7 @@ diff -u libmagic.orig/readelf.c libmagic/readelf.c +#endif #define xsh_addr (clazz == ELFCLASS32 \ -- ? (void *)&sh32 \ -- : (void *)&sh64) -+ ? (void *) &sh32 \ -+ : (void *) &sh64) - #define xsh_sizeof (clazz == ELFCLASS32 \ - ? sizeof(sh32) \ - : sizeof(sh64)) -@@ -168,8 +174,8 @@ - ? elf_getu32(swap, ph32.p_filesz) \ - : elf_getu64(swap, ph64.p_filesz))) - #define xnh_addr (clazz == ELFCLASS32 \ -- ? (void *)&nh32 \ -- : (void *)&nh64) -+ ? (void *) &nh32 \ -+ : (void *) &nh64) - #define xph_memsz (size_t)((clazz == ELFCLASS32 \ - ? elf_getu32(swap, ph32.p_memsz) \ - : elf_getu64(swap, ph64.p_memsz))) -@@ -189,8 +195,8 @@ - ? prpsoffsets32[i] \ - : prpsoffsets64[i]) - #define xcap_addr (clazz == ELFCLASS32 \ -- ? (void *)&cap32 \ -- : (void *)&cap64) -+ ? (void *) &cap32 \ -+ : (void *) &cap64) - #define xcap_sizeof (clazz == ELFCLASS32 \ - ? sizeof cap32 \ - : sizeof cap64) + ? (void *)&sh32 \ @@ -292,7 +298,7 @@ { Elf32_Phdr ph32; @@ -2891,7 +2735,7 @@ diff -u libmagic.orig/readelf.c libmagic/readelf.c file_badread(ms); return -1; } -@@ -852,24 +867,12 @@ +@@ -913,24 +928,12 @@ return 0; } @@ -2919,7 +2763,7 @@ diff -u libmagic.orig/readelf.c libmagic/readelf.c file_badread(ms); return -1; } -@@ -894,14 +897,17 @@ +@@ -955,14 +958,17 @@ /* Things we can determine when we seek */ switch (xsh_type) { case SHT_NOTE: @@ -2936,13 +2780,13 @@ diff -u libmagic.orig/readelf.c libmagic/readelf.c - if (pread(fd, nbuf, xsh_size, xsh_offset) == -1) { + if (FINFO_READ_FUNC(fd, nbuf, (size_t)xsh_size) != + (ssize_t)xsh_size) { -+ efree(nbuf); file_badread(ms); - free(nbuf); ++ efree(nbuf); return -1; } -@@ -910,25 +916,16 @@ +@@ -971,25 +977,16 @@ if (noff >= (off_t)xsh_size) break; noff = donote(ms, nbuf, (size_t)noff, @@ -2973,7 +2817,7 @@ diff -u libmagic.orig/readelf.c libmagic/readelf.c file_badseek(ms); return -1; } -@@ -940,7 +937,7 @@ +@@ -1001,7 +998,7 @@ MAX(sizeof cap32, sizeof cap64)]; if ((coff += xcap_sizeof) > (off_t)xsh_size) break; @@ -2982,7 +2826,7 @@ diff -u libmagic.orig/readelf.c libmagic/readelf.c (ssize_t)xcap_sizeof) { file_badread(ms); return -1; -@@ -966,13 +963,12 @@ +@@ -1027,13 +1024,12 @@ break; } } @@ -2998,7 +2842,7 @@ diff -u libmagic.orig/readelf.c libmagic/readelf.c if (file_printf(ms, ", %sstripped", stripped ? "" : "not ") == -1) return -1; if (cap_hw1) { -@@ -1051,7 +1047,7 @@ +@@ -1112,7 +1108,7 @@ const char *shared_libraries = ""; unsigned char nbuf[BUFSIZ]; ssize_t bufsize; @@ -3007,7 +2851,7 @@ diff -u libmagic.orig/readelf.c libmagic/readelf.c if (size != xph_sizeof) { if (file_printf(ms, ", corrupted program header size") == -1) -@@ -1060,8 +1056,13 @@ +@@ -1121,8 +1117,13 @@ } for ( ; num; num--) { @@ -3023,7 +2867,7 @@ diff -u libmagic.orig/readelf.c libmagic/readelf.c return -1; } -@@ -1099,9 +1100,12 @@ +@@ -1160,9 +1161,12 @@ * This is a PT_NOTE section; loop through all the notes * in the section. */ @@ -3039,7 +2883,7 @@ diff -u libmagic.orig/readelf.c libmagic/readelf.c if (bufsize == -1) { file_badread(ms); return -1; -@@ -1162,7 +1166,7 @@ +@@ -1223,7 +1227,7 @@ /* * If we cannot seek, it must be a pipe, socket or fifo. */ @@ -3049,8 +2893,8 @@ diff -u libmagic.orig/readelf.c libmagic/readelf.c if (fstat(fd, &st) == -1) { diff -u libmagic.orig/readelf.h libmagic/readelf.h ---- libmagic.orig/readelf.h Thu Mar 21 18:45:14 2013 -+++ libmagic/readelf.h Mon Dec 2 15:25:29 2013 +--- libmagic.orig/readelf.h Tue Nov 5 16:41:56 2013 ++++ libmagic/readelf.h Fri Feb 21 00:21:27 2014 @@ -44,9 +44,17 @@ typedef uint32_t Elf32_Word; typedef uint8_t Elf32_Char; @@ -3070,11 +2914,11 @@ diff -u libmagic.orig/readelf.h libmagic/readelf.h typedef uint32_t Elf64_Word; typedef uint8_t Elf64_Char; diff -u libmagic.orig/softmagic.c libmagic/softmagic.c ---- libmagic.orig/softmagic.c Thu Mar 21 18:45:14 2013 -+++ libmagic/softmagic.c Mon Mar 10 16:40:55 2014 -@@ -41,6 +41,11 @@ - #include <stdlib.h> - #include <time.h> +--- libmagic.orig/softmagic.c Thu Feb 13 00:20:53 2014 ++++ libmagic/softmagic.c Sun Mar 9 13:14:07 2014 +@@ -50,6 +50,11 @@ + #include <locale.h> + #endif +#ifndef PREG_OFFSET_CAPTURE +# define PREG_OFFSET_CAPTURE (1<<8) @@ -3084,32 +2928,17 @@ diff -u libmagic.orig/softmagic.c libmagic/softmagic.c private int match(struct magic_set *, struct magic *, uint32_t, const unsigned char *, size_t, size_t, int, int, int, int, int *, int *, -@@ -62,6 +67,8 @@ +@@ -71,7 +76,8 @@ private void cvt_32(union VALUETYPE *, const struct magic *); private void cvt_64(union VALUETYPE *, const struct magic *); +-#define OFFSET_OOB(n, o, i) ((n) < (o) || (i) >= ((n) - (o))) +#define OFFSET_OOB(n, o, i) ((n) < (o) || (i) > ((n) - (o))) + /* * softmagic - lookup one file in parsed, in-memory copy of database * Passed the name and FILE * of one file to be typed. -@@ -69,13 +76,13 @@ - /*ARGSUSED1*/ /* nbytes passed for regularity, maybe need later */ - protected int - file_softmagic(struct magic_set *ms, const unsigned char *buf, size_t nbytes, -- int mode, int text) -+ size_t level, int mode, int text) - { - struct mlist *ml; - int rv, printed_something = 0, need_separator = 0; - for (ml = ms->mlist[0]->next; ml != ms->mlist[0]; ml = ml->next) - if ((rv = match(ms, ml->magic, ml->nmagic, buf, nbytes, 0, mode, -- text, 0, 0, &printed_something, &need_separator, -+ text, 0, level, &printed_something, &need_separator, - NULL)) != 0) - return rv; - -@@ -132,7 +139,7 @@ +@@ -142,7 +148,7 @@ struct magic *m = &magic[magindex]; if (m->type != FILE_NAME) @@ -3118,7 +2947,7 @@ diff -u libmagic.orig/softmagic.c libmagic/softmagic.c #define FLT (STRING_BINTEST | STRING_TEXTTEST) ((text && (m->str_flags & FLT) == STRING_BINTEST) || (!text && (m->str_flags & FLT) == STRING_TEXTTEST))) || -@@ -209,8 +216,8 @@ +@@ -221,8 +227,8 @@ if (file_check_mem(ms, ++cont_level) == -1) return -1; @@ -3129,37 +2958,37 @@ diff -u libmagic.orig/softmagic.c libmagic/softmagic.c m = &magic[magindex]; ms->line = m->lineno; /* for messages */ -@@ -335,44 +342,22 @@ +@@ -350,46 +356,24 @@ private int check_fmt(struct magic_set *ms, struct magic *m) { - regex_t rx; -- int rc; +- int rc, rv = -1; - -- if (strchr(m->desc, '%') == NULL) + pcre *pce; -+ int re_options; ++ int re_options, rv = -1; + pcre_extra *re_extra; + TSRMLS_FETCH(); + -+ if (strchr(m->desc, '%') == NULL) { + if (strchr(m->desc, '%') == NULL) return 0; -- + + (void)setlocale(LC_CTYPE, "C"); - rc = regcomp(&rx, "%[-0-9\\.]*s", REG_EXTENDED|REG_NOSUB); - if (rc) { - char errmsg[512]; - (void)regerror(rc, &rx, errmsg, sizeof(errmsg)); - file_magerror(ms, "regex error %d, (%s)", rc, errmsg); -+ } -+ + if ((pce = pcre_get_compiled_regex("~%[-0-9.]*s~", &re_extra, &re_options TSRMLS_CC)) == NULL) { - return -1; ++ rv = -1; } else { - rc = regexec(&rx, m->desc, 0, 0, 0); - regfree(&rx); -- return !rc; -+ return !pcre_exec(pce, re_extra, m->desc, strlen(m->desc), 0, re_options, NULL, 0); +- rv = !rc; ++ rv = !pcre_exec(pce, re_extra, m->desc, strlen(m->desc), 0, re_options, NULL, 0); } + (void)setlocale(LC_CTYPE, ""); + return rv; } -#ifndef HAVE_STRNDUP @@ -3184,7 +3013,7 @@ diff -u libmagic.orig/softmagic.c libmagic/softmagic.c private int32_t mprint(struct magic_set *ms, struct magic *m) { -@@ -583,13 +568,13 @@ +@@ -618,13 +602,13 @@ char *cp; int rval; @@ -3194,13 +3023,13 @@ diff -u libmagic.orig/softmagic.c libmagic/softmagic.c file_oomem(ms, ms->search.rm_len); return -1; } - rval = file_printf(ms, m->desc, cp); + rval = file_printf(ms, F(m->desc, "%s"), cp); - free(cp); + efree(cp); if (rval == -1) return -1; -@@ -835,16 +820,16 @@ +@@ -870,16 +854,16 @@ if (m->num_mask) \ switch (m->mask_op & FILE_OPS_MASK) { \ case FILE_OPADD: \ @@ -3221,7 +3050,7 @@ diff -u libmagic.orig/softmagic.c libmagic/softmagic.c break; \ } \ -@@ -1145,9 +1130,6 @@ +@@ -1178,9 +1162,6 @@ "nbytes=%zu, count=%u)\n", m->type, m->flag, offset, o, nbytes, count); mdebug(offset, (char *)(void *)p, sizeof(union VALUETYPE)); @@ -3231,79 +3060,7 @@ diff -u libmagic.orig/softmagic.c libmagic/softmagic.c } if (m->flag & INDIR) { -@@ -1191,7 +1173,7 @@ - } - switch (cvt_flip(m->in_type, flip)) { - case FILE_BYTE: -- if (nbytes < (offset + 1)) -+ if (OFFSET_OOB(nbytes, offset, 1)) - return 0; - if (off) { - switch (m->in_op & FILE_OPS_MASK) { -@@ -1226,7 +1208,7 @@ - offset = ~offset; - break; - case FILE_BESHORT: -- if (nbytes < (offset + 2)) -+ if (OFFSET_OOB(nbytes, offset, 2)) - return 0; - if (off) { - switch (m->in_op & FILE_OPS_MASK) { -@@ -1278,7 +1260,7 @@ - offset = ~offset; - break; - case FILE_LESHORT: -- if (nbytes < (offset + 2)) -+ if (OFFSET_OOB(nbytes, offset, 2)) - return 0; - if (off) { - switch (m->in_op & FILE_OPS_MASK) { -@@ -1330,7 +1312,7 @@ - offset = ~offset; - break; - case FILE_SHORT: -- if (nbytes < (offset + 2)) -+ if (OFFSET_OOB(nbytes, offset, 2)) - return 0; - if (off) { - switch (m->in_op & FILE_OPS_MASK) { -@@ -1367,7 +1349,7 @@ - break; - case FILE_BELONG: - case FILE_BEID3: -- if (nbytes < (offset + 4)) -+ if (OFFSET_OOB(nbytes, offset, 4)) - return 0; - if (off) { - switch (m->in_op & FILE_OPS_MASK) { -@@ -1438,7 +1420,7 @@ - break; - case FILE_LELONG: - case FILE_LEID3: -- if (nbytes < (offset + 4)) -+ if (OFFSET_OOB(nbytes, offset, 4)) - return 0; - if (off) { - switch (m->in_op & FILE_OPS_MASK) { -@@ -1508,7 +1490,7 @@ - offset = ~offset; - break; - case FILE_MELONG: -- if (nbytes < (offset + 4)) -+ if (OFFSET_OOB(nbytes, offset, 4)) - return 0; - if (off) { - switch (m->in_op & FILE_OPS_MASK) { -@@ -1578,7 +1560,7 @@ - offset = ~offset; - break; - case FILE_LONG: -- if (nbytes < (offset + 4)) -+ if (OFFSET_OOB(nbytes, offset, 4)) - return 0; - if (off) { - switch (m->in_op & FILE_OPS_MASK) { -@@ -1644,23 +1626,20 @@ +@@ -1679,9 +1660,6 @@ if ((ms->flags & MAGIC_DEBUG) != 0) { mdebug(offset, (char *)(void *)p, sizeof(union VALUETYPE)); @@ -3313,74 +3070,11 @@ diff -u libmagic.orig/softmagic.c libmagic/softmagic.c } } - /* Verify we have enough data to match magic type */ - switch (m->type) { - case FILE_BYTE: -- if (nbytes < (offset + 1)) /* should alway be true */ -+ if (OFFSET_OOB(nbytes, offset, 1)) - return 0; - break; - - case FILE_SHORT: - case FILE_BESHORT: - case FILE_LESHORT: -- if (nbytes < (offset + 2)) -+ if (OFFSET_OOB(nbytes, offset, 2)) - return 0; - break; - -@@ -1679,38 +1658,40 @@ - case FILE_FLOAT: - case FILE_BEFLOAT: - case FILE_LEFLOAT: -- if (nbytes < (offset + 4)) -+ if (OFFSET_OOB(nbytes, offset, 4)) - return 0; - break; - - case FILE_DOUBLE: - case FILE_BEDOUBLE: - case FILE_LEDOUBLE: -- if (nbytes < (offset + 8)) -+ if (OFFSET_OOB(nbytes, offset, 8)) - return 0; - break; - - case FILE_STRING: - case FILE_PSTRING: - case FILE_SEARCH: -- if (nbytes < (offset + m->vallen)) -+ if (OFFSET_OOB(nbytes, offset, m->vallen)) - return 0; - break; - - case FILE_REGEX: -- if (nbytes < offset) -+ if (OFFSET_OOB(nbytes, offset, 0)) - return 0; - break; - - case FILE_INDIRECT: -- if (nbytes < offset) -+ if (offset == 0) -+ return 0; -+ if (OFFSET_OOB(nbytes, offset, 0)) - return 0; - sbuf = ms->o.buf; - soffset = ms->offset; - ms->o.buf = NULL; - ms->offset = 0; - rv = file_softmagic(ms, s + offset, nbytes - offset, -- BINTEST, text); -+ recursion_level, BINTEST, text); - if ((ms->flags & MAGIC_DEBUG) != 0) - fprintf(stderr, "indirect @offs=%u[%d]\n", offset, rv); - rbuf = ms->o.buf; -@@ -1718,16 +1699,26 @@ +@@ -1755,11 +1733,21 @@ ms->offset = soffset; if (rv == 1) { if ((ms->flags & (MAGIC_MIME|MAGIC_APPLE)) == 0 && -- file_printf(ms, m->desc, offset) == -1) +- file_printf(ms, F(m->desc, "%u"), offset) == -1) + file_printf(ms, m->desc, offset) == -1) { + if (rbuf) { + efree(rbuf); @@ -3401,13 +3095,7 @@ diff -u libmagic.orig/softmagic.c libmagic/softmagic.c } return rv; - case FILE_USE: -- if (nbytes < offset) -+ if (OFFSET_OOB(nbytes, offset, 0)) - return 0; - sbuf = m->value.s; - if (*sbuf == '^') { -@@ -1837,6 +1828,42 @@ +@@ -1875,6 +1863,42 @@ return file_strncmp(a, b, len, flags); } @@ -3450,51 +3138,13 @@ diff -u libmagic.orig/softmagic.c libmagic/softmagic.c private int magiccheck(struct magic_set *ms, struct magic *m) { -@@ -1996,69 +2023,157 @@ +@@ -2035,63 +2059,151 @@ break; } case FILE_REGEX: { - int rc; - regex_t rx; - char errmsg[512]; -- -- if (ms->search.s == NULL) -- return 0; -- -- l = 0; -- rc = regcomp(&rx, m->value.s, -- REG_EXTENDED|REG_NEWLINE| -- ((m->str_flags & STRING_IGNORE_CASE) ? REG_ICASE : 0)); -- if (rc) { -- (void)regerror(rc, &rx, errmsg, sizeof(errmsg)); -- file_magerror(ms, "regex error %d, (%s)", -- rc, errmsg); -- v = (uint64_t)-1; -- } -- else { -- regmatch_t pmatch[1]; --#ifndef REG_STARTEND --#define REG_STARTEND 0 -- size_t l = ms->search.s_len - 1; -- char c = ms->search.s[l]; -- ((char *)(intptr_t)ms->search.s)[l] = '\0'; --#else -- pmatch[0].rm_so = 0; -- pmatch[0].rm_eo = ms->search.s_len; --#endif -- rc = regexec(&rx, (const char *)ms->search.s, -- 1, pmatch, REG_STARTEND); --#if REG_STARTEND == 0 -- ((char *)(intptr_t)ms->search.s)[l] = c; --#endif -- switch (rc) { -- case 0: -- ms->search.s += (int)pmatch[0].rm_so; -- ms->search.offset += (size_t)pmatch[0].rm_so; -- ms->search.rm_len = -- (size_t)(pmatch[0].rm_eo - pmatch[0].rm_so); -- v = 0; -- break; + zval *pattern; + int options = 0; + pcre_cache_entry *pce; @@ -3628,11 +3278,48 @@ diff -u libmagic.orig/softmagic.c libmagic/softmagic.c + zval_dtor(pattern); + FREE_ZVAL(pattern); + return -1; -+ } ++ } + } +- if (ms->search.s == NULL) +- return 0; + +- l = 0; +- rc = regcomp(&rx, m->value.s, +- REG_EXTENDED|REG_NEWLINE| +- ((m->str_flags & STRING_IGNORE_CASE) ? REG_ICASE : 0)); +- if (rc) { +- (void)regerror(rc, &rx, errmsg, sizeof(errmsg)); +- file_magerror(ms, "regex error %d, (%s)", +- rc, errmsg); +- v = (uint64_t)-1; +- } +- else { +- regmatch_t pmatch[1]; +-#ifndef REG_STARTEND +-#define REG_STARTEND 0 +- size_t l = ms->search.s_len - 1; +- char c = ms->search.s[l]; +- ((char *)(intptr_t)ms->search.s)[l] = '\0'; +-#else +- pmatch[0].rm_so = 0; +- pmatch[0].rm_eo = ms->search.s_len; +-#endif +- rc = regexec(&rx, (const char *)ms->search.s, +- 1, pmatch, REG_STARTEND); +-#if REG_STARTEND == 0 +- ((char *)(intptr_t)ms->search.s)[l] = c; +-#endif +- switch (rc) { +- case 0: +- ms->search.s += (int)pmatch[0].rm_so; +- ms->search.offset += (size_t)pmatch[0].rm_so; +- ms->search.rm_len = +- (size_t)(pmatch[0].rm_eo - pmatch[0].rm_so); +- v = 0; +- break; +- - case REG_NOMATCH: -+ + } else { v = 1; - break; @@ -3650,17 +3337,21 @@ diff -u libmagic.orig/softmagic.c libmagic/softmagic.c } - if (v == (uint64_t)-1) - return -1; -- break; + zval_dtor(pattern); + FREE_ZVAL(pattern); -+ break; + break; } case FILE_INDIRECT: - case FILE_USE: - case FILE_NAME: -- return 1; -+ return 1; - default: - file_magerror(ms, "invalid type %d in magiccheck()", m->type); - return -1; +diff -u libmagic.orig/strcasestr.c libmagic/strcasestr.c +--- libmagic.orig/strcasestr.c Thu Dec 5 17:57:50 2013 ++++ libmagic/strcasestr.c Sun May 4 21:29:20 2014 +@@ -37,6 +37,8 @@ + __RCSID("$NetBSD: strncasecmp.c,v 1.2 2007/06/04 18:19:27 christos Exp $"); + #endif /* LIBC_SCCS and not lint */ + ++#include "php_stdint.h" ++ + #include <assert.h> + #include <ctype.h> + #include <string.h> |