From 270df3ffd6c29296a32899690dcb6dbf29cba693 Mon Sep 17 00:00:00 2001 From: Anatol Belski Date: Sat, 25 Oct 2014 12:01:58 +0200 Subject: [PATCH] updated libmagic.patch in 5.5 --- ext/fileinfo/libmagic.patch | 204 +++++++++++++++++++++++++++--------- 1 file changed, 156 insertions(+), 48 deletions(-) diff --git a/ext/fileinfo/libmagic.patch b/ext/fileinfo/libmagic.patch index a91a658397..14409852bf 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 Mon Apr 14 23:42:51 2014 ++++ libmagic/apprentice.c Mon Sep 29 10:53:07 2014 @@ -29,6 +29,8 @@ * apprentice - make one pass through /etc/magic, learning its secrets. */ @@ -479,6 +479,15 @@ diff -u libmagic.orig/apprentice.c libmagic/apprentice.c return NULL; } return map; +@@ -1233,7 +1269,7 @@ + * the sign extension must have happened. + */ + case FILE_BYTE: +- v = (char) v; ++ v = (signed char) v; + break; + case FILE_SHORT: + case FILE_BESHORT: @@ -1500,7 +1536,7 @@ if (me->cont_count == me->max_count) { struct magic *nm; @@ -833,7 +842,7 @@ diff -u libmagic.orig/apprentice.c libmagic/apprentice.c } diff -u libmagic.orig/ascmagic.c libmagic/ascmagic.c --- libmagic.orig/ascmagic.c Wed Oct 31 18:03:01 2012 -+++ libmagic/ascmagic.c Mon Apr 14 23:42:51 2014 ++++ libmagic/ascmagic.c Mon Mar 10 16:40:55 2014 @@ -139,7 +139,7 @@ /* malloc size is a conservative overestimate; could be improved, or at least realloced after conversion. */ @@ -872,7 +881,7 @@ diff -u libmagic.orig/ascmagic.c libmagic/ascmagic.c } diff -u libmagic.orig/cdf.c libmagic/cdf.c --- libmagic.orig/cdf.c Thu Mar 21 18:45:14 2013 -+++ libmagic/cdf.c Tue Jul 1 09:00:09 2014 ++++ libmagic/cdf.c Wed Aug 20 21:20:34 2014 @@ -43,7 +43,17 @@ #include #endif @@ -955,7 +964,7 @@ diff -u libmagic.orig/cdf.c libmagic/cdf.c errno = EFTYPE; return (size_t)-1; } -@@ -796,7 +812,11 @@ +@@ -796,11 +812,15 @@ if (cdf_check_stream_offset(sst, h, e, 0, __LINE__) == -1) goto out; for (i = 0; i < sh.sh_properties; i++) { @@ -968,6 +977,11 @@ diff -u libmagic.orig/cdf.c libmagic/cdf.c q = (const uint8_t *)(const void *) ((const char *)(const void *)p + ofs - 2 * sizeof(uint32_t)); +- if (q > e) { ++ if (q < p || q > e) { + DPRINTF(("Ran of the end %p > %p\n", q, e)); + goto out; + } @@ -810,6 +830,10 @@ i, inp[i].pi_id, inp[i].pi_type, q - p, offs)); if (inp[i].pi_type & CDF_VECTOR) { @@ -1056,7 +1070,7 @@ diff -u libmagic.orig/cdf.c libmagic/cdf.c } 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 Apr 14 23:32:55 2014 ++++ libmagic/cdf.h Mon Dec 2 15:25:29 2013 @@ -35,10 +35,12 @@ #ifndef _H_CDF_ #define _H_CDF_ @@ -1099,7 +1113,7 @@ diff -u libmagic.orig/cdf.h libmagic/cdf.h 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 Apr 14 23:32:55 2014 ++++ libmagic/cdf_time.c Mon Dec 2 15:25:29 2013 @@ -96,7 +96,7 @@ } @@ -1159,7 +1173,7 @@ diff -u libmagic.orig/cdf_time.c libmagic/cdf_time.c 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 Apr 14 23:42:51 2014 ++++ libmagic/compress.c Mon Dec 2 15:25:29 2013 @@ -32,6 +32,7 @@ * uncompress(method, old, n, newch) - uncompress old into new, * using method, return sizeof new @@ -1322,7 +1336,7 @@ diff -u libmagic.orig/compress.c libmagic/compress.c +#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 Apr 14 23:42:51 2014 ++++ libmagic/file.h Mon Mar 10 16:40:55 2014 @@ -33,11 +33,9 @@ #ifndef __file_h__ #define __file_h__ @@ -1532,7 +1546,7 @@ 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 Apr 14 23:42:51 2014 ++++ libmagic/fsmagic.c Mon Dec 2 15:25:29 2013 @@ -59,27 +59,21 @@ # define minor(dev) ((dev) & 0xff) #endif @@ -1899,7 +1913,7 @@ diff -u libmagic.orig/fsmagic.c libmagic/fsmagic.c } diff -u libmagic.orig/funcs.c libmagic/funcs.c --- libmagic.orig/funcs.c Wed Oct 31 18:03:01 2012 -+++ libmagic/funcs.c Mon Apr 14 23:42:51 2014 ++++ libmagic/funcs.c Mon Mar 10 16:40:55 2014 @@ -41,52 +41,42 @@ #if defined(HAVE_WCTYPE_H) #include @@ -2193,7 +2207,7 @@ diff -u libmagic.orig/funcs.c libmagic/funcs.c + diff -u libmagic.orig/magic.c libmagic/magic.c --- libmagic.orig/magic.c Fri Jan 11 17:43:09 2013 -+++ libmagic/magic.c Mon Apr 14 23:42:51 2014 ++++ libmagic/magic.c Mon Dec 2 15:29:02 2013 @@ -25,11 +25,6 @@ * SUCH DAMAGE. */ @@ -2537,7 +2551,7 @@ diff -u libmagic.orig/magic.c libmagic/magic.c 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 Apr 14 23:42:51 2014 ++++ libmagic/magic.h Mon Dec 2 15:25:29 2013 @@ -87,6 +87,7 @@ const char *magic_getpath(const char *, int); @@ -2556,14 +2570,14 @@ diff -u libmagic.orig/magic.h libmagic/magic.h diff -u libmagic.orig/print.c libmagic/print.c --- libmagic.orig/print.c Thu Mar 21 18:45:14 2013 -+++ libmagic/print.c Mon Apr 14 23:42:51 2014 -@@ -29,12 +29,17 @@ ++++ libmagic/print.c Mon Dec 2 15:29:02 2013 +@@ -28,13 +28,17 @@ + /* * print.c - debugging printout routines */ - +#define _GNU_SOURCE +#include "php.h" -+ + #include "file.h" +#include "cdf.h" @@ -2575,7 +2589,7 @@ diff -u libmagic.orig/print.c libmagic/print.c #include #include #include -@@ -43,188 +48,28 @@ +@@ -43,188 +47,28 @@ #endif #include @@ -2776,7 +2790,7 @@ diff -u libmagic.orig/print.c libmagic/print.c } protected const char * -@@ -235,7 +80,7 @@ +@@ -235,7 +79,7 @@ struct tm *tm; if (flags & FILE_T_WINDOWS) { @@ -2787,7 +2801,7 @@ diff -u libmagic.orig/print.c libmagic/print.c } diff -u libmagic.orig/readcdf.c libmagic/readcdf.c --- libmagic.orig/readcdf.c Wed Oct 31 18:03:01 2012 -+++ libmagic/readcdf.c Tue May 27 22:17:37 2014 ++++ libmagic/readcdf.c Thu Apr 24 19:54:40 2014 @@ -30,7 +30,11 @@ #endif @@ -2863,7 +2877,7 @@ diff -u libmagic.orig/readcdf.c libmagic/readcdf.c return -1; diff -u libmagic.orig/readelf.c libmagic/readelf.c --- libmagic.orig/readelf.c Thu Mar 21 18:45:14 2013 -+++ libmagic/readelf.c Mon Apr 14 23:42:51 2014 ++++ libmagic/readelf.c Sat Oct 25 11:50:05 2014 @@ -48,8 +48,8 @@ private int dophn_exec(struct magic_set *, int, int, int, off_t, int, size_t, off_t, int *, int); @@ -2956,7 +2970,21 @@ diff -u libmagic.orig/readelf.c libmagic/readelf.c file_badread(ms); return -1; } -@@ -852,24 +867,12 @@ +@@ -357,6 +372,13 @@ + uint32_t namesz, descsz; + unsigned char *nbuf = CAST(unsigned char *, vbuf); + ++ if (xnh_sizeof + offset > size) { ++ /* ++ * We're out of note headers. ++ */ ++ return xnh_sizeof + offset; ++ } ++ + (void)memcpy(xnh_addr, &nbuf[offset], xnh_sizeof); + offset += xnh_sizeof; + +@@ -852,24 +874,12 @@ return 0; } @@ -2984,7 +3012,7 @@ diff -u libmagic.orig/readelf.c libmagic/readelf.c file_badread(ms); return -1; } -@@ -894,14 +897,17 @@ +@@ -894,14 +904,17 @@ /* Things we can determine when we seek */ switch (xsh_type) { case SHT_NOTE: @@ -3007,7 +3035,7 @@ diff -u libmagic.orig/readelf.c libmagic/readelf.c return -1; } -@@ -910,25 +916,16 @@ +@@ -910,25 +923,16 @@ if (noff >= (off_t)xsh_size) break; noff = donote(ms, nbuf, (size_t)noff, @@ -3038,7 +3066,7 @@ diff -u libmagic.orig/readelf.c libmagic/readelf.c file_badseek(ms); return -1; } -@@ -940,7 +937,7 @@ +@@ -940,7 +944,7 @@ MAX(sizeof cap32, sizeof cap64)]; if ((coff += xcap_sizeof) > (off_t)xsh_size) break; @@ -3047,7 +3075,7 @@ diff -u libmagic.orig/readelf.c libmagic/readelf.c (ssize_t)xcap_sizeof) { file_badread(ms); return -1; -@@ -966,13 +963,12 @@ +@@ -966,13 +970,12 @@ break; } } @@ -3063,7 +3091,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 @@ +@@ -1051,7 +1054,7 @@ const char *shared_libraries = ""; unsigned char nbuf[BUFSIZ]; ssize_t bufsize; @@ -3072,7 +3100,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 @@ +@@ -1060,8 +1063,13 @@ } for ( ; num; num--) { @@ -3088,7 +3116,7 @@ diff -u libmagic.orig/readelf.c libmagic/readelf.c return -1; } -@@ -1099,9 +1100,12 @@ +@@ -1099,9 +1107,12 @@ * This is a PT_NOTE section; loop through all the notes * in the section. */ @@ -3104,7 +3132,7 @@ diff -u libmagic.orig/readelf.c libmagic/readelf.c if (bufsize == -1) { file_badread(ms); return -1; -@@ -1162,7 +1166,7 @@ +@@ -1162,7 +1173,7 @@ /* * If we cannot seek, it must be a pipe, socket or fifo. */ @@ -3115,7 +3143,7 @@ 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 Apr 14 23:42:51 2014 ++++ libmagic/readelf.h Mon Dec 2 15:25:29 2013 @@ -44,9 +44,17 @@ typedef uint32_t Elf32_Word; typedef uint8_t Elf32_Char; @@ -3136,7 +3164,7 @@ diff -u libmagic.orig/readelf.h libmagic/readelf.h 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 Tue Jul 1 09:00:09 2014 ++++ libmagic/softmagic.c Wed Aug 20 21:20:34 2014 @@ -41,6 +41,11 @@ #include #include @@ -3149,6 +3177,15 @@ 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 *, +@@ -53,7 +58,7 @@ + private int32_t moffset(struct magic_set *, struct magic *); + private void mdebug(uint32_t, const char *, size_t); + private int mcopy(struct magic_set *, union VALUETYPE *, int, int, +- const unsigned char *, uint32_t, size_t, size_t); ++ const unsigned char *, uint32_t, size_t, struct magic *); + private int mconvert(struct magic_set *, struct magic *, int); + private int print_sep(struct magic_set *, int); + private int handle_annotation(struct magic_set *, struct magic *); @@ -62,6 +67,8 @@ private void cvt_32(union VALUETYPE *, const struct magic *); private void cvt_64(union VALUETYPE *, const struct magic *); @@ -3308,9 +3345,72 @@ diff -u libmagic.orig/softmagic.c libmagic/softmagic.c while (len--) *ptr1++ = *ptr2++; *ptr1 = '\0'; -@@ -1145,9 +1138,6 @@ - "nbytes=%zu, count=%u)\n", m->type, m->flag, offset, o, - nbytes, count); +@@ -1010,7 +1003,7 @@ + + private int + mcopy(struct magic_set *ms, union VALUETYPE *p, int type, int indir, +- const unsigned char *s, uint32_t offset, size_t nbytes, size_t linecnt) ++ const unsigned char *s, uint32_t offset, size_t nbytes, struct magic *m) + { + /* + * Note: FILE_SEARCH and FILE_REGEX do not actually copy +@@ -1030,15 +1023,24 @@ + const char *last; /* end of search region */ + const char *buf; /* start of search region */ + const char *end; +- size_t lines; ++ size_t lines, linecnt, bytecnt; ++ ++ linecnt = m->str_range; ++ bytecnt = linecnt * 80; + ++ if (bytecnt == 0) { ++ bytecnt = 8192; ++ } ++ if (bytecnt > nbytes) { ++ bytecnt = nbytes; ++ } + if (s == NULL) { + ms->search.s_len = 0; + ms->search.s = NULL; + return 0; + } + buf = RCAST(const char *, s) + offset; +- end = last = RCAST(const char *, s) + nbytes; ++ end = last = RCAST(const char *, s) + bytecnt; + /* mget() guarantees buf <= last */ + for (lines = linecnt, b = buf; lines && b < end && + ((b = CAST(const char *, +@@ -1051,7 +1053,7 @@ + b++; + } + if (lines) +- last = RCAST(const char *, s) + nbytes; ++ last = RCAST(const char *, s) + bytecnt; + + ms->search.s = buf; + ms->search.s_len = last - buf; +@@ -1125,7 +1127,6 @@ + int *need_separator, int *returnval) + { + uint32_t soffset, offset = ms->offset; +- uint32_t count = m->str_range; + int rv, oneed_separator; + char *sbuf, *rbuf; + union VALUETYPE *p = &ms->ms_value; +@@ -1137,17 +1138,13 @@ + } + + if (mcopy(ms, p, m->type, m->flag & INDIR, s, (uint32_t)(offset + o), +- (uint32_t)nbytes, count) == -1) ++ (uint32_t)nbytes, m) == -1) + return -1; + + if ((ms->flags & MAGIC_DEBUG) != 0) { + fprintf(stderr, "mget(type=%d, flag=%x, offset=%u, o=%zu, " +- "nbytes=%zu, count=%u)\n", m->type, m->flag, offset, o, +- nbytes, count); ++ "nbytes=%zu)\n", m->type, m->flag, offset, o, nbytes); mdebug(offset, (char *)(void *)p, sizeof(union VALUETYPE)); -#ifndef COMPILE_ONLY - file_mdump(m); @@ -3318,7 +3418,7 @@ diff -u libmagic.orig/softmagic.c libmagic/softmagic.c } if (m->flag & INDIR) { -@@ -1191,7 +1181,7 @@ +@@ -1191,7 +1188,7 @@ } switch (cvt_flip(m->in_type, flip)) { case FILE_BYTE: @@ -3327,7 +3427,7 @@ diff -u libmagic.orig/softmagic.c libmagic/softmagic.c return 0; if (off) { switch (m->in_op & FILE_OPS_MASK) { -@@ -1226,7 +1216,7 @@ +@@ -1226,7 +1223,7 @@ offset = ~offset; break; case FILE_BESHORT: @@ -3336,7 +3436,7 @@ diff -u libmagic.orig/softmagic.c libmagic/softmagic.c return 0; if (off) { switch (m->in_op & FILE_OPS_MASK) { -@@ -1278,7 +1268,7 @@ +@@ -1278,7 +1275,7 @@ offset = ~offset; break; case FILE_LESHORT: @@ -3345,7 +3445,7 @@ diff -u libmagic.orig/softmagic.c libmagic/softmagic.c return 0; if (off) { switch (m->in_op & FILE_OPS_MASK) { -@@ -1330,7 +1320,7 @@ +@@ -1330,7 +1327,7 @@ offset = ~offset; break; case FILE_SHORT: @@ -3354,7 +3454,7 @@ diff -u libmagic.orig/softmagic.c libmagic/softmagic.c return 0; if (off) { switch (m->in_op & FILE_OPS_MASK) { -@@ -1367,7 +1357,7 @@ +@@ -1367,7 +1364,7 @@ break; case FILE_BELONG: case FILE_BEID3: @@ -3363,7 +3463,7 @@ diff -u libmagic.orig/softmagic.c libmagic/softmagic.c return 0; if (off) { switch (m->in_op & FILE_OPS_MASK) { -@@ -1438,7 +1428,7 @@ +@@ -1438,7 +1435,7 @@ break; case FILE_LELONG: case FILE_LEID3: @@ -3372,7 +3472,7 @@ diff -u libmagic.orig/softmagic.c libmagic/softmagic.c return 0; if (off) { switch (m->in_op & FILE_OPS_MASK) { -@@ -1508,7 +1498,7 @@ +@@ -1508,7 +1505,7 @@ offset = ~offset; break; case FILE_MELONG: @@ -3381,7 +3481,7 @@ diff -u libmagic.orig/softmagic.c libmagic/softmagic.c return 0; if (off) { switch (m->in_op & FILE_OPS_MASK) { -@@ -1578,7 +1568,7 @@ +@@ -1578,7 +1575,7 @@ offset = ~offset; break; case FILE_LONG: @@ -3390,7 +3490,15 @@ diff -u libmagic.orig/softmagic.c libmagic/softmagic.c return 0; if (off) { switch (m->in_op & FILE_OPS_MASK) { -@@ -1644,23 +1634,20 @@ +@@ -1637,30 +1634,27 @@ + if ((ms->flags & MAGIC_DEBUG) != 0) + fprintf(stderr, "indirect +offs=%u\n", offset); + } +- if (mcopy(ms, p, m->type, 0, s, offset, nbytes, count) == -1) ++ if (mcopy(ms, p, m->type, 0, s, offset, nbytes, m) == -1) + return -1; + ms->offset = offset; + if ((ms->flags & MAGIC_DEBUG) != 0) { mdebug(offset, (char *)(void *)p, sizeof(union VALUETYPE)); @@ -3416,7 +3524,7 @@ diff -u libmagic.orig/softmagic.c libmagic/softmagic.c return 0; break; -@@ -1679,38 +1666,40 @@ +@@ -1679,38 +1673,40 @@ case FILE_FLOAT: case FILE_BEFLOAT: case FILE_LEFLOAT: @@ -3463,7 +3571,7 @@ diff -u libmagic.orig/softmagic.c libmagic/softmagic.c if ((ms->flags & MAGIC_DEBUG) != 0) fprintf(stderr, "indirect @offs=%u[%d]\n", offset, rv); rbuf = ms->o.buf; -@@ -1718,16 +1707,26 @@ +@@ -1718,16 +1714,26 @@ ms->offset = soffset; if (rv == 1) { if ((ms->flags & (MAGIC_MIME|MAGIC_APPLE)) == 0 && @@ -3494,7 +3602,7 @@ diff -u libmagic.orig/softmagic.c libmagic/softmagic.c return 0; sbuf = m->value.s; if (*sbuf == '^') { -@@ -1837,6 +1836,42 @@ +@@ -1837,6 +1843,42 @@ return file_strncmp(a, b, len, flags); } @@ -3537,7 +3645,7 @@ diff -u libmagic.orig/softmagic.c libmagic/softmagic.c private int magiccheck(struct magic_set *ms, struct magic *m) { -@@ -1996,69 +2031,157 @@ +@@ -1996,69 +2038,157 @@ break; } case FILE_REGEX: { @@ -3608,7 +3716,7 @@ diff -u libmagic.orig/softmagic.c libmagic/softmagic.c + zval *retval; + zval *subpats; + char *haystack; -+ ++ + MAKE_STD_ZVAL(retval); + ALLOC_INIT_ZVAL(subpats); + -- 2.40.0