iliaa Tue Aug 26 12:23:29 2008 UTC Removed files: (Branch: PHP_5_3) /php-src/ext/fileinfo/libmagic file.c file_opts.h getopt_long.c
Modified files: /php-src/ext/fileinfo/libmagic apprentice.c ascmagic.c compress.c config.h file.h funcs.c magic.c readelf.c softmagic.c Log: Upgraded the lib to use PHP memory allocation routines. Fixed a crash caused by analysis of DEADJOE files A little bit of CS inside libmagic
http://cvs.php.net/viewvc.cgi/php-src/ext/fileinfo/libmagic/apprentice.c?r1=1.7&r2=1.7.2.1&diff_format=u Index: php-src/ext/fileinfo/libmagic/apprentice.c diff -u php-src/ext/fileinfo/libmagic/apprentice.c:1.7 php-src/ext/fileinfo/libmagic/apprentice.c:1.7.2.1 --- php-src/ext/fileinfo/libmagic/apprentice.c:1.7 Fri Jul 25 08:18:34 2008 +++ php-src/ext/fileinfo/libmagic/apprentice.c Tue Aug 26 12:23:29 2008 @@ -42,9 +42,6 @@ #include <fcntl.h> #include <sys/stat.h> #include <sys/param.h> -#ifdef QUICK -#include <sys/mman.h> -#endif #include <sys/types.h> #include <dirent.h> @@ -124,42 +121,7 @@ private const char mime_marker[] = "!:mime"; private const size_t mime_marker_len = sizeof(mime_marker) - 1; -#ifdef COMPILE_ONLY - -int main(int, char *[]); - -int -main(int argc, char *argv[]) -{ - int ret; - struct magic_set *ms; - char *progname; - - if ((progname = strrchr(argv[0], '/')) != NULL) - progname++; - else - progname = argv[0]; - - if (argc != 2) { - (void)fprintf(stderr, "Usage: %s file\n", progname); - return 1; - } - - if ((ms = magic_open(MAGIC_CHECK)) == NULL) { - (void)fprintf(stderr, "%s: %s\n", progname, strerror(errno)); - return 1; - } - ret = magic_compile(ms, argv[1]) == -1 ? 1 : 0; - if (ret == 1) - (void)fprintf(stderr, "%s: %s\n", progname, magic_error(ms)); - magic_close(ms); - return ret; -} -#endif /* COMPILE_ONLY */ - -#ifdef PHP_BUNDLE #include "../data_file.c" -#endif static const struct type_tbl_s { const char name[16]; @@ -269,7 +231,7 @@ if (rv != 0) return -1; rv = apprentice_compile(ms, &magic, &nmagic, fn); - free(magic); + efree(magic); return rv; } @@ -289,11 +251,7 @@ return -1; } - if ((ml = malloc(sizeof(*ml))) == NULL) { - file_delmagic(magic, mapped, nmagic); - file_oomem(ms, sizeof(*ml)); - return -1; - } + ml = emalloc(sizeof(*ml)); ml->magic = magic; ml->nmagic = nmagic; @@ -314,23 +272,18 @@ if (p == NULL) return; switch (type) { -#ifdef PHP_BUNDLE case 3: /* Do nothing, it's part of the code segment */ break; -#endif -#ifdef QUICK - case 2: - p--; - (void)munmap((void *)p, sizeof(*p) * (entries + 1)); - break; -#endif + case 1: p--; /*FALLTHROUGH*/ + case 0: - free(p); + efree(p); break; + default: abort(); } @@ -349,30 +302,16 @@ if (fn == NULL) fn = getenv("MAGIC"); if (fn == NULL) { -#ifdef PHP_BUNDLE - if ((mlist = malloc(sizeof(*mlist))) == NULL) { - file_oomem(ms, sizeof(*mlist)); - return NULL; - } + mlist = emalloc(sizeof(*mlist)); mlist->next = mlist->prev = mlist; apprentice_1(ms, fn, action, mlist); return mlist; -#else - fn = MAGIC; -#endif } - if ((mfn = strdup(fn)) == NULL) { - file_oomem(ms, strlen(fn)); - return NULL; - } + mfn = estrdup(fn); fn = mfn; - if ((mlist = malloc(sizeof(*mlist))) == NULL) { - free(mfn); - file_oomem(ms, sizeof(*mlist)); - return NULL; - } + mlist = emalloc(sizeof(*mlist)); mlist->next = mlist->prev = mlist; while (fn) { @@ -386,13 +325,13 @@ fn = p; } if (errs == -1) { - free(mfn); - free(mlist); + efree(mfn); + efree(mlist); mlist = NULL; file_error(ms, 0, "could not find any magic files!"); return NULL; } - free(mfn); + efree(mfn); return mlist; } @@ -649,10 +588,7 @@ ms->flags |= MAGIC_CHECK; /* Enable checks for parsed files */ maxmagic = MAXMAGIS; - if ((marray = calloc(maxmagic, sizeof(*marray))) == NULL) { - file_oomem(ms, maxmagic * sizeof(*marray)); - return -1; - } + marray = ecalloc(maxmagic, sizeof(*marray)); marraycount = 0; /* print silly verbose header for USG compat. */ @@ -735,11 +671,7 @@ for (i = 0; i < marraycount; i++) mentrycount += marray[i].cont_count; - if ((*magicp = malloc(sizeof(**magicp) * mentrycount)) == NULL) { - file_oomem(ms, sizeof(**magicp) * mentrycount); - errs++; - goto out; - } + *magicp = emalloc(sizeof(**magicp) * mentrycount); mentrycount = 0; for (i = 0; i < marraycount; i++) { @@ -749,8 +681,8 @@ } out: for (i = 0; i < marraycount; i++) - free(marray[i].mp); - free(marray); + efree(marray[i].mp); + efree(marray); if (errs) { *magicp = NULL; *nmagicp = 0; @@ -823,9 +755,9 @@ case FILE_DEFAULT: 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; } } @@ -1024,10 +956,7 @@ if (me->cont_count == me->max_count) { struct magic *nm; size_t cnt = me->max_count + ALLOC_CHUNK; - if ((nm = realloc(me->mp, sizeof(*nm) * cnt)) == NULL) { - file_oomem(ms, sizeof(*nm) * cnt); - return -1; - } + nm = erealloc(me->mp, sizeof(*nm) * cnt); me->mp = m = nm; me->max_count = cnt; } @@ -1039,21 +968,13 @@ struct magic_entry *mp; maxmagic += ALLOC_INCR; - if ((mp = realloc(*mentryp, sizeof(*mp) * maxmagic)) == - NULL) { - file_oomem(ms, sizeof(*mp) * maxmagic); - return -1; - } - (void)memset(&mp[*nmentryp], 0, sizeof(*mp) * - ALLOC_INCR); + mp = erealloc(*mentryp, sizeof(*mp) * maxmagic); + (void)memset(&mp[*nmentryp], 0, sizeof(*mp) * ALLOC_INCR); *mentryp = mp; } me = &(*mentryp)[*nmentryp]; if (me->mp == NULL) { - if ((m = malloc(sizeof(*m) * ALLOC_CHUNK)) == NULL) { - file_oomem(ms, sizeof(*m) * ALLOC_CHUNK); - return -1; - } + m = safe_emalloc(sizeof(*m), ALLOC_CHUNK, 0); me->mp = m; me->max_count = ALLOC_CHUNK; } else @@ -1908,13 +1829,11 @@ void *mm = NULL; int ret = 0; -#ifdef PHP_BUNDLE if (fn == NULL) { mm = &php_magic_database; ret = 3; goto internal_loaded; } -#endif mkdbname(fn, &dbname, 0); if (dbname == NULL) @@ -1932,29 +1851,18 @@ goto error1; } -#ifdef QUICK - if ((mm = mmap(0, (size_t)st.st_size, PROT_READ|PROT_WRITE, - MAP_PRIVATE|MAP_FILE, fd, (off_t)0)) == MAP_FAILED) { - file_error(ms, errno, "cannot map `%s'", dbname); - goto error1; - } - ret = 2; -#else - if ((mm = malloc((size_t)st.st_size)) == NULL) { - file_oomem(ms, (size_t)st.st_size); - goto error1; - } + mm = emalloc((size_t)st.st_size); if (read(fd, mm, (size_t)st.st_size) != (size_t)st.st_size) { file_badread(ms); goto error1; } ret = 1; -#endif + (void)close(fd); fd = -1; -#ifdef PHP_BUNDLE + internal_loaded: -#endif + *magicp = mm; ptr = (uint32_t *)(void *)*magicp; if (*ptr != MAGICNO) { @@ -1975,35 +1883,36 @@ VERSIONNO, dbname, version); goto error1; } -#ifdef PHP_BUNDLE - if (fn == NULL) + + if (fn == NULL) { *nmagicp = (sizeof(php_magic_database) / sizeof(struct magic)); - else /* the statement after the #endif is used */ -#endif - *nmagicp = (uint32_t)(st.st_size / sizeof(struct magic)); - if (*nmagicp > 0) + } else { + *nmagicp = (uint32_t)(st.st_size / sizeof(struct magic)); + } + if (*nmagicp > 0) { (*nmagicp)--; + } (*magicp)++; - if (needsbyteswap) + if (needsbyteswap) { byteswap(*magicp, *nmagicp); - free(dbname); + } + + if (dbname) { + efree(dbname); + } return ret; error1: if (fd != -1) (void)close(fd); if (mm) { -#ifdef QUICK - (void)munmap((void *)mm, (size_t)st.st_size); -#else - free(mm); -#endif + efree(mm); } else { *magicp = NULL; *nmagicp = 0; } error2: - free(dbname); + efree(dbname); return -1; } @@ -2051,7 +1960,7 @@ (void)close(fd); rv = 0; out: - free(dbname); + efree(dbname); return rv; } @@ -2068,9 +1977,9 @@ fn = ++p; } - (void)asprintf(buf, "%s%s", fn, ext); + (void)spprintf(buf, 0, "%s%s", fn, ext); if (*buf && strlen(*buf) > MAXPATHLEN) { - free(*buf); + efree(*buf); *buf = NULL; } } http://cvs.php.net/viewvc.cgi/php-src/ext/fileinfo/libmagic/ascmagic.c?r1=1.1&r2=1.1.2.1&diff_format=u Index: php-src/ext/fileinfo/libmagic/ascmagic.c diff -u php-src/ext/fileinfo/libmagic/ascmagic.c:1.1 php-src/ext/fileinfo/libmagic/ascmagic.c:1.1.2.1 --- php-src/ext/fileinfo/libmagic/ascmagic.c:1.1 Fri Jul 11 14:13:50 2008 +++ php-src/ext/fileinfo/libmagic/ascmagic.c Tue Aug 26 12:23:29 2008 @@ -101,13 +101,12 @@ * Undo the NUL-termination kindly provided by process() * but leave at least one byte to look at */ - while (nbytes > 1 && buf[nbytes - 1] == '\0') + while (nbytes > 1 && buf[nbytes - 1] == '\0') { nbytes--; + } - if ((nbuf = calloc(1, (nbytes + 1) * sizeof(nbuf[0]))) == NULL) - goto done; - if ((ubuf = calloc(1, (nbytes + 1) * sizeof(ubuf[0]))) == NULL) - goto done; + nbuf = ecalloc(1, (nbytes + 1) * sizeof(nbuf[0])); + ubuf = ecalloc(1, (nbytes + 1) * sizeof(ubuf[0])); /* * Then try to determine whether it's any character code we can @@ -172,10 +171,8 @@ re-converting improved, or at least realloced after re-converting conversion. */ mlen = ulen * 6; - if ((utf8_buf = malloc(mlen)) == NULL) { - file_oomem(ms, mlen); - goto done; - } + utf8_buf = emalloc(mlen); + if ((utf8_end = encode_utf8(utf8_buf, mlen, ubuf, ulen)) == NULL) goto done; if (file_softmagic(ms, utf8_buf, utf8_end - utf8_buf, TEXTTEST) != 0) { @@ -348,11 +345,11 @@ rv = 1; done: if (nbuf) - free(nbuf); + efree(nbuf); if (ubuf) - free(ubuf); + efree(ubuf); if (utf8_buf) - free(utf8_buf); + efree(utf8_buf); return rv; } http://cvs.php.net/viewvc.cgi/php-src/ext/fileinfo/libmagic/compress.c?r1=1.1&r2=1.1.2.1&diff_format=u Index: php-src/ext/fileinfo/libmagic/compress.c diff -u php-src/ext/fileinfo/libmagic/compress.c:1.1 php-src/ext/fileinfo/libmagic/compress.c:1.1.2.1 --- php-src/ext/fileinfo/libmagic/compress.c:1.1 Fri Jul 11 14:13:50 2008 +++ php-src/ext/fileinfo/libmagic/compress.c Tue Aug 26 12:23:29 2008 @@ -32,6 +32,7 @@ * uncompress(method, old, n, newch) - uncompress old into new, * using method, return sizeof new */ +#include "config.h" #include "file.h" #include "magic.h" #include <stdio.h> @@ -133,7 +134,7 @@ } error: if (newbuf) - free(newbuf); + efree(newbuf); ms->flags |= MAGIC_COMPRESS; return rv; } @@ -330,9 +331,7 @@ if (data_start >= n) return 0; - if ((*newch = (unsigned char *)malloc(HOWMANY + 1)) == NULL) { - return 0; - } + *newch = (unsigned char *)emalloc(HOWMANY + 1)); /* XXX: const castaway, via strchr */ z.next_in = (Bytef *)strchr((const char *)old + data_start, @@ -455,20 +454,14 @@ fdin[1] = -1; } - if ((*newch = (unsigned char *) malloc(HOWMANY + 1)) == NULL) { -#ifdef DEBUG - (void)fprintf(stderr, "Malloc failed (%s)\n", - strerror(errno)); -#endif - n = 0; - goto err; - } + *newch = (unsigned char *) emalloc(HOWMANY + 1); + if ((r = sread(fdout[0], *newch, HOWMANY, 0)) <= 0) { #ifdef DEBUG (void)fprintf(stderr, "Read failed (%s)\n", strerror(errno)); #endif - free(*newch); + efree(*newch); n = 0; newch[0] = '\0'; goto err; http://cvs.php.net/viewvc.cgi/php-src/ext/fileinfo/libmagic/config.h?r1=1.3.2.1&r2=1.3.2.2&diff_format=u Index: php-src/ext/fileinfo/libmagic/config.h diff -u php-src/ext/fileinfo/libmagic/config.h:1.3.2.1 php-src/ext/fileinfo/libmagic/config.h:1.3.2.2 --- php-src/ext/fileinfo/libmagic/config.h:1.3.2.1 Thu Jul 31 00:33:02 2008 +++ php-src/ext/fileinfo/libmagic/config.h Tue Aug 26 12:23:29 2008 @@ -1,10 +1 @@ -#ifdef PHP_WIN32 -# include "config.w32.h" -#else -# include <php_config.h> -#endif - -#ifdef HAVE_CONFIG_H -#include "../config.h" -#endif -#define PHP_BUNDLE +#include "php.h" http://cvs.php.net/viewvc.cgi/php-src/ext/fileinfo/libmagic/file.h?r1=1.1&r2=1.1.2.1&diff_format=u Index: php-src/ext/fileinfo/libmagic/file.h diff -u php-src/ext/fileinfo/libmagic/file.h:1.1 php-src/ext/fileinfo/libmagic/file.h:1.1.2.1 --- php-src/ext/fileinfo/libmagic/file.h:1.1 Fri Jul 11 14:13:50 2008 +++ php-src/ext/fileinfo/libmagic/file.h Tue Aug 26 12:23:29 2008 @@ -366,13 +366,6 @@ #define strtoul(a, b, c) strtol(a, b, c) #endif -#ifndef HAVE_VASPRINTF -int vasprintf(char **ptr, const char *format_string, va_list vargs); -#endif -#ifndef HAVE_ASPRINTF -int asprintf(char **ptr, const char *format_string, ...); -#endif - #if defined(HAVE_MMAP) && defined(HAVE_SYS_MMAN_H) && !defined(QUICK) #define QUICK #endif http://cvs.php.net/viewvc.cgi/php-src/ext/fileinfo/libmagic/funcs.c?r1=1.3.2.1&r2=1.3.2.2&diff_format=u Index: php-src/ext/fileinfo/libmagic/funcs.c diff -u php-src/ext/fileinfo/libmagic/funcs.c:1.3.2.1 php-src/ext/fileinfo/libmagic/funcs.c:1.3.2.2 --- php-src/ext/fileinfo/libmagic/funcs.c:1.3.2.1 Sun Aug 10 19:48:54 2008 +++ php-src/ext/fileinfo/libmagic/funcs.c Tue Aug 26 12:23:29 2008 @@ -54,27 +54,23 @@ va_list ap; size_t size; int len; - char *buf, *newstr; + char *buf = NULL, *newstr; va_start(ap, fmt); - len = vasprintf(&buf, fmt, ap); - if (len < 0) - goto out; + len = vspprintf(&buf, 0, fmt, ap); va_end(ap); 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; -out: - file_error(ms, errno, "vasprintf failed"); - return -1; } /* @@ -89,7 +85,7 @@ if (ms->haderr) return; if (lineno != 0) { - free(ms->o.buf); + efree(ms->o.buf); ms->o.buf = NULL; file_printf(ms, "line %u: ", lineno); } @@ -124,12 +120,6 @@ } protected void -file_oomem(struct magic_set *ms, size_t len) -{ - file_error(ms, errno, "cannot allocate %zu bytes", len); -} - -protected void file_badseek(struct magic_set *ms) { file_error(ms, errno, "error seeking"); @@ -223,6 +213,9 @@ file_error(ms, 0, "no magic files loaded"); return -1; } + if (ms->o.buf) { + efree(ms->o.buf); + } ms->o.buf = NULL; ms->haderr = 0; ms->error = -1; @@ -252,14 +245,10 @@ /* * 4 is for octal representation, + 1 is for NUL */ len = strlen(ms->o.buf); if (len > (SIZE_MAX - 1) / 4) { - file_oomem(ms, len); return NULL; } psize = len * 4 + 1; - if ((pbuf = realloc(ms->o.pbuf, psize)) == NULL) { - file_oomem(ms, psize); - return NULL; - } + pbuf = erealloc(ms->o.pbuf, psize); ms->o.pbuf = pbuf; #if defined(HAVE_WCHAR_H) && defined(HAVE_MBRTOWC) && defined(HAVE_WCWIDTH) @@ -319,12 +308,7 @@ if (level >= ms->c.len) { len = (ms->c.len += 20) * sizeof(*ms->c.li); - ms->c.li = (ms->c.li == NULL) ? malloc(len) : - realloc(ms->c.li, len); - if (ms->c.li == NULL) { - file_oomem(ms, len); - return -1; - } + ms->c.li = (ms->c.li == NULL) ? emalloc(len) : erealloc(ms->c.li, len); } ms->c.li[level].got_match = 0; #ifdef ENABLE_CONDITIONALS http://cvs.php.net/viewvc.cgi/php-src/ext/fileinfo/libmagic/magic.c?r1=1.1&r2=1.1.2.1&diff_format=u Index: php-src/ext/fileinfo/libmagic/magic.c diff -u php-src/ext/fileinfo/libmagic/magic.c:1.1 php-src/ext/fileinfo/libmagic/magic.c:1.1.2.1 --- php-src/ext/fileinfo/libmagic/magic.c:1.1 Fri Jul 11 14:13:50 2008 +++ php-src/ext/fileinfo/libmagic/magic.c Tue Aug 26 12:23:29 2008 @@ -35,9 +35,6 @@ #include <sys/types.h> #include <sys/param.h> /* for MAXPATHLEN */ #include <sys/stat.h> -#ifdef QUICK -#include <sys/mman.h> -#endif #include <limits.h> /* for PIPE_BUF */ #if defined(HAVE_UTIMES) @@ -98,8 +95,7 @@ { struct magic_set *ms; - if ((ms = calloc((size_t)1, sizeof(struct magic_set))) == NULL) - return NULL; + ms = ecalloc((size_t)1, sizeof(struct magic_set)); if (magic_setflags(ms, flags) == -1) { errno = EINVAL; @@ -108,9 +104,7 @@ ms->o.buf = ms->o.pbuf = NULL; - ms->c.li = malloc((ms->c.len = 10) * sizeof(*ms->c.li)); - if (ms->c.li == NULL) - goto free; + ms->c.li = emalloc((ms->c.len = 10) * sizeof(*ms->c.li)); ms->haderr = 0; ms->error = -1; @@ -119,7 +113,7 @@ ms->line = 0; return ms; free: - free(ms); + efree(ms); return NULL; } @@ -135,10 +129,10 @@ struct mlist *next = ml->next; struct magic *mg = ml->magic; file_delmagic(mg, ml->mapped, ml->nmagic); - free(ml); + efree(ml); ml = next; } - free(ml); + efree(ml); } private int @@ -162,11 +156,19 @@ public void magic_close(struct magic_set *ms) { - free_mlist(ms->mlist); - free(ms->o.pbuf); - free(ms->o.buf); - free(ms->c.li); - free(ms); + if (ms->mlist) { + free_mlist(ms->mlist); + } + if (ms->o.pbuf) { + efree(ms->o.pbuf); + } + if (ms->o.buf) { + efree(ms->o.buf); + } + if (ms->c.li) { + efree(ms->c.li); + } + efree(ms); } /* @@ -267,8 +269,7 @@ * some overlapping space for matches near EOF */ #define SLOP (1 + sizeof(union VALUETYPE)) - if ((buf = malloc(HOWMANY + SLOP)) == NULL) - return NULL; + buf = emalloc(HOWMANY + SLOP); if (file_reset(ms) == -1) goto done; @@ -351,7 +352,7 @@ goto done; rv = 0; done: - free(buf); + efree(buf); close_and_restore(ms, inname, fd, &sb); return rv == 0 ? file_getbuffer(ms) : NULL; } http://cvs.php.net/viewvc.cgi/php-src/ext/fileinfo/libmagic/readelf.c?r1=1.1&r2=1.1.2.1&diff_format=u Index: php-src/ext/fileinfo/libmagic/readelf.c diff -u php-src/ext/fileinfo/libmagic/readelf.c:1.1 php-src/ext/fileinfo/libmagic/readelf.c:1.1.2.1 --- php-src/ext/fileinfo/libmagic/readelf.c:1.1 Fri Jul 11 14:13:50 2008 +++ php-src/ext/fileinfo/libmagic/readelf.c Tue Aug 26 12:23:29 2008 @@ -789,20 +789,16 @@ file_badread(ms); return -1; } - if ((nbuf = malloc((size_t)xsh_size)) == NULL) { - file_error(ms, errno, "Cannot allocate memory" - " for note"); - return -1; - } + nbuf = emalloc((size_t)xsh_size); if ((noff = lseek(fd, (off_t)xsh_offset, SEEK_SET)) == (off_t)-1) { file_badread(ms); - free(nbuf); + efree(nbuf); return -1; } if (read(fd, nbuf, (size_t)xsh_size) != (ssize_t)xsh_size) { - free(nbuf); + efree(nbuf); file_badread(ms); return -1; } @@ -818,11 +814,11 @@ break; } if ((lseek(fd, off, SEEK_SET)) == (off_t)-1) { - free(nbuf); + efree(nbuf); file_badread(ms); return -1; } - free(nbuf); + efree(nbuf); break; } } http://cvs.php.net/viewvc.cgi/php-src/ext/fileinfo/libmagic/softmagic.c?r1=1.1&r2=1.1.2.1&diff_format=u Index: php-src/ext/fileinfo/libmagic/softmagic.c diff -u php-src/ext/fileinfo/libmagic/softmagic.c:1.1 php-src/ext/fileinfo/libmagic/softmagic.c:1.1.2.1 --- php-src/ext/fileinfo/libmagic/softmagic.c:1.1 Fri Jul 11 14:13:50 2008 +++ php-src/ext/fileinfo/libmagic/softmagic.c Tue Aug 26 12:23:29 2008 @@ -127,9 +127,9 @@ if ((m->flag & BINTEST) != mode) { /* Skip sub-tests */ - while (magic[magindex + 1].cont_level != 0 && - ++magindex < nmagic) + while (magic[magindex + 1].cont_level != 0 && ++magindex < nmagic) { continue; + } continue; /* Skip to next top-level test*/ } @@ -157,9 +157,9 @@ * main entry didn't match, * flush its continuations */ - while (magindex < nmagic - 1 && - magic[magindex + 1].cont_level != 0) + while (magindex < nmagic - 1 && magic[magindex + 1].cont_level != 0) { magindex++; + } continue; } @@ -197,8 +197,7 @@ } ms->offset = m->offset; if (m->flag & OFFADD) { - ms->offset += - ms->c.li[cont_level - 1].off; + ms->offset += ms->c.li[cont_level - 1].off; } #ifdef ENABLE_CONDITIONALS @@ -282,11 +281,12 @@ private int check_fmt(struct magic_set *ms, struct magic *m) { - regex_t rx; + regex_t rx = {0}; int rc; - if (strchr(MAGIC_DESC, '%') == NULL) + if (strchr(MAGIC_DESC, '%') == NULL) { return 0; + } rc = regcomp(&rx, "%[-0-9\\.]*s", REG_EXTENDED|REG_NOSUB); if (rc) { @@ -295,32 +295,14 @@ file_magerror(ms, "regex error %d, (%s)", rc, errmsg); return -1; } else { - rc = regexec(&rx, MAGIC_DESC, 0, 0, 0); + regmatch_t *pmatch = (regmatch_t *)ecalloc(sizeof(regmatch_t), rx.re_nsub + 1); + rc = regexec(&rx, MAGIC_DESC, rx.re_nsub + 1, pmatch, 0); + efree(pmatch); regfree(&rx); return !rc; } } -#ifndef HAVE_STRNDUP -char * strndup(const char *, size_t); - -char * -strndup(const char *str, size_t n) -{ - size_t len; - char *copy; - - len = strlen(str); - if (len > n) - len = n; - if (!(copy = malloc(len + 1))) - return (NULL); - (void) memcpy(copy, str, len + 1); - copy[len] = '\0'; - return (copy); -} -#endif /* HAVE_STRNDUP */ - private int32_t mprint(struct magic_set *ms, struct magic *m) { @@ -338,7 +320,7 @@ case -1: return -1; case 1: - if (asprintf(&buf, "%c", (unsigned char)v) < 0) + if (spprintf(&buf, 0, "%c", (unsigned char)v) < 0) return -1; if (file_printf(ms, MAGIC_DESC, buf) == -1) return -1; @@ -359,7 +341,7 @@ case -1: return -1; case 1: - if (asprintf(&buf, "%hu", (unsigned short)v) < 0) + if (spprintf(&buf, 0, "%hu", (unsigned short)v) < 0) return -1; if (file_printf(ms, MAGIC_DESC, buf) == -1) return -1; @@ -381,7 +363,7 @@ case -1: return -1; case 1: - if (asprintf(&buf, "%u", (uint32_t)v) < 0) + if (spprintf(&buf, 0, "%u", (uint32_t)v) < 0) return -1; if (file_printf(ms, MAGIC_DESC, buf) == -1) return -1; @@ -467,7 +449,7 @@ case -1: return -1; case 1: - if (asprintf(&buf, "%g", vf) < 0) + if (spprintf(&buf, 0, "%g", vf) < 0) return -1; if (file_printf(ms, MAGIC_DESC, buf) == -1) return -1; @@ -488,7 +470,7 @@ case -1: return -1; case 1: - if (asprintf(&buf, "%g", vd) < 0) + if (spprintf(&buf, 0, "%g", vd) < 0) return -1; if (file_printf(ms, MAGIC_DESC, buf) == -1) return -1; @@ -505,13 +487,10 @@ char *cp; int rval; - cp = strndup((const char *)ms->search.s, ms->search.rm_len); - if (cp == NULL) { - file_oomem(ms, ms->search.rm_len); - return -1; - } + cp = estrndup((const char *)ms->search.s, ms->search.rm_len); + rval = file_printf(ms, MAGIC_DESC, cp); - free(cp); + efree(cp); if (rval == -1) return -1; @@ -1665,24 +1644,20 @@ } case FILE_REGEX: { int rc; - regex_t rx; + regex_t rx = {0}; 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)); + 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); + file_magerror(ms, "regex error %d, (%s)", rc, errmsg); v = (uint64_t)-1; - } - else { - regmatch_t pmatch[1]; + } else { + regmatch_t *pmatch = (regmatch_t *)ecalloc(sizeof(regmatch_t), rx.re_nsub + 1); #ifndef REG_STARTEND #define REG_STARTEND 0 size_t l = ms->search.s_len - 1; @@ -1692,8 +1667,7 @@ 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); + 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 @@ -1701,8 +1675,7 @@ 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); + ms->search.rm_len = (size_t)(pmatch[0].rm_eo - pmatch[0].rm_so); v = 0; break; @@ -1712,15 +1685,16 @@ default: (void)regerror(rc, &rx, errmsg, sizeof(errmsg)); - file_magerror(ms, "regexec error %d, (%s)", - rc, errmsg); + file_magerror(ms, "regexec error %d, (%s)", rc, errmsg); v = (uint64_t)-1; break; } regfree(&rx); + efree(pmatch); } - if (v == (uint64_t)-1) + if (v == (uint64_t)-1) { return -1; + } break; } default:
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php