From: Mikko Koppanen Date: Sat, 26 Dec 2009 15:00:21 +0000 (+0000) Subject: Upgrade bundled libmagic to 5.03 (fixes CDF parsing related issues) X-Git-Tag: php-5.4.0alpha1~191^2~2159 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=24af48e40217440f2ed5e7d54b745c4a3a5f05eb;p=php Upgrade bundled libmagic to 5.03 (fixes CDF parsing related issues) Clean up / remove whitespace differences to make next merge easier Removed unnecessary files from trunk --- diff --git a/ext/fileinfo/libmagic/apprentice.c b/ext/fileinfo/libmagic/apprentice.c index dcea282038..030961aa61 100644 --- a/ext/fileinfo/libmagic/apprentice.c +++ b/ext/fileinfo/libmagic/apprentice.c @@ -34,7 +34,7 @@ #include "file.h" #ifndef lint -FILE_RCSID("@(#)$File: apprentice.c,v 1.132 2008/03/28 18:19:30 christos Exp $") +FILE_RCSID("@(#)$File: apprentice.c,v 1.151 2009/03/18 15:19:23 christos Exp $") #endif /* lint */ #include "magic.h" @@ -611,7 +611,11 @@ load_1(struct magic_set *ms, int action, const char *fn, int *errs, } else { /* read and parse this file */ +#if (PHP_MAJOR_VERSION < 6) + for (ms->line = 1; (line = php_stream_get_line(stream, buffer , BUFSIZ, &line_len)) != NULL; ms->line++) { +#else for (ms->line = 1; (line = php_stream_get_line(stream, ZSTR(buffer), BUFSIZ, &line_len)) != NULL; ms->line++) { +#endif if (line_len == 0) /* null line, garbage, etc */ continue; @@ -853,9 +857,9 @@ file_signextend(struct magic_set *ms, struct magic *m, uint64_t v) case FILE_INDIRECT: break; default: - if (ms->flags & MAGIC_CHECK) { - file_magwarn(ms, "cannot happen: m->type=%d\n", m->type); - } + if (ms->flags & MAGIC_CHECK) + file_magwarn(ms, "cannot happen: m->type=%d\n", + m->type); return ~0U; } } @@ -1671,7 +1675,7 @@ check_format(struct magic_set *ms, struct magic *m) */ file_magwarn(ms, "Printf format `%c' is not valid for type " "`%s' in description `%s'", *ptr ? *ptr : '?', - file_names[m->type], m->desc); + file_names[m->type], m->desc); return -1; } diff --git a/ext/fileinfo/libmagic/apptype.c b/ext/fileinfo/libmagic/apptype.c index 85136ed156..31b8095e13 100644 --- a/ext/fileinfo/libmagic/apptype.c +++ b/ext/fileinfo/libmagic/apptype.c @@ -27,10 +27,9 @@ #include "file.h" #ifndef lint -FILE_RCSID("@(#)$File: apptype.c,v 1.7 2007/01/12 17:38:27 christos Exp $") +FILE_RCSID("@(#)$File: apptype.c,v 1.11 2009/02/04 18:24:32 christos Exp $") #endif /* lint */ - #include #include diff --git a/ext/fileinfo/libmagic/ascmagic.c b/ext/fileinfo/libmagic/ascmagic.c index 4fee8a87b2..e73b26fe9b 100644 --- a/ext/fileinfo/libmagic/ascmagic.c +++ b/ext/fileinfo/libmagic/ascmagic.c @@ -2,7 +2,7 @@ * Copyright (c) Ian F. Darwin 1986-1995. * Software written by Ian F. Darwin and others; * maintained 1995-present by Christos Zoulas and others. - * + * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: @@ -12,7 +12,7 @@ * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. - * + * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE @@ -36,7 +36,7 @@ #include "file.h" #ifndef lint -FILE_RCSID("@(#)$File: ascmagic.c,v 1.62 2008/03/01 22:21:48 rrt Exp $") +FILE_RCSID("@(#)$File: ascmagic.c,v 1.75 2009/02/03 20:27:51 christos Exp $") #endif /* lint */ #include "magic.h" @@ -66,14 +66,14 @@ trim_nuls(const unsigned char *buf, size_t nbytes) { while (nbytes > 1 && buf[nbytes - 1] == '\0') nbytes--; - + return nbytes; } protected int file_ascmagic(struct magic_set *ms, const unsigned char *buf, size_t nbytes) { - unichar *ubuf = NULL; + unichar *ubuf = NULL; size_t ulen; int rv = 1; @@ -264,7 +264,7 @@ subtype_identified: if (file_printf(ms, ", with") == -1) goto done; - if (n_crlf == 0 && n_cr == 0 && n_nel == 0 && n_lf == 0) { + if (n_crlf == 0 && n_cr == 0 && n_nel == 0 && n_lf == 0) { if (file_printf(ms, " no") == -1) goto done; } else { diff --git a/ext/fileinfo/libmagic/cdf.c b/ext/fileinfo/libmagic/cdf.c index eecfa1e452..a3b4a11fc0 100644 --- a/ext/fileinfo/libmagic/cdf.c +++ b/ext/fileinfo/libmagic/cdf.c @@ -32,7 +32,7 @@ #include "file.h" #ifndef lint -FILE_RCSID("@(#)$File: cdf.c,v 1.17 2009/02/03 20:27:51 christos Exp $") +FILE_RCSID("@(#)$File: cdf.c,v 1.30 2009/05/06 14:29:47 christos Exp $") #endif #include @@ -237,6 +237,19 @@ cdf_unpack_dir(cdf_directory_t *d, char *buf) CDF_UNPACK(d->d_unused0); } +static int +cdf_check_stream_offset(const cdf_stream_t *sst, const void *p, size_t tail) +{ + const char *b = (const char *)sst->sst_tab; + const char *e = ((const char *)p) + tail; + if (e >= b && (size_t)(e - b) < sst->sst_dirlen * sst->sst_len) + return 0; + DPRINTF((stderr, "offset begin %p end %p %zu >= %zu\n", b, e, + (size_t)(e - b), sst->sst_dirlen * sst->sst_len)); + errno = EFTYPE; + return -1; +} + static ssize_t cdf_read(const cdf_info_t *info, off_t off, void *buf, size_t len) { @@ -264,7 +277,6 @@ cdf_read(const cdf_info_t *info, off_t off, void *buf, size_t len) return (ssize_t)len; } - int cdf_read_header(const cdf_info_t *info, cdf_header_t *h) { @@ -332,15 +344,15 @@ cdf_read_sat(const cdf_info_t *info, cdf_header_t *h, cdf_sat_t *sat) break; #define CDF_SEC_LIMIT (UINT32_MAX / (4 * ss)) - if (h->h_num_sectors_in_master_sat > CDF_SEC_LIMIT || - i > CDF_SEC_LIMIT / nsatpersec) { + if (h->h_num_sectors_in_master_sat > CDF_SEC_LIMIT / nsatpersec || + i > CDF_SEC_LIMIT) { DPRINTF(("Number of sectors in master SAT too big %u %zu\n", h->h_num_sectors_in_master_sat, i)); errno = EFTYPE; return -1; } - sat->sat_len = h->h_num_sectors_in_master_sat + i * nsatpersec; + sat->sat_len = h->h_num_sectors_in_master_sat * nsatpersec + i; DPRINTF(("sat_len = %zu ss = %zu\n", sat->sat_len, ss)); if ((sat->sat_tab = calloc(sat->sat_len, ss)) == NULL) return -1; @@ -360,6 +372,8 @@ cdf_read_sat(const cdf_info_t *info, cdf_header_t *h, cdf_sat_t *sat) mid = h->h_secid_first_sector_in_master_sat; for (j = 0; j < h->h_num_sectors_in_master_sat; j++) { + if (mid < 0) + goto out; if (j >= CDF_LOOP_LIMIT) { DPRINTF(("Reading master sector loop limit")); errno = EFTYPE; @@ -371,10 +385,8 @@ cdf_read_sat(const cdf_info_t *info, cdf_header_t *h, cdf_sat_t *sat) } for (k = 0; k < nsatpersec; k++, i++) { sec = CDF_TOLE4(msa[k]); - if (sec < 0) { - sat->sat_len = i; - break; - } + if (sec < 0) + goto out; if (i >= sat->sat_len) { DPRINTF(("Out of bounds reading MSA %u >= %u", i, sat->sat_len)); @@ -390,6 +402,8 @@ cdf_read_sat(const cdf_info_t *info, cdf_header_t *h, cdf_sat_t *sat) } mid = CDF_TOLE4(msa[nsatpersec]); } +out: + sat->sat_len = i; free(msa); return 0; out2: @@ -478,7 +492,7 @@ cdf_read_short_sector_chain(const cdf_header_t *h, scn->sst_len = cdf_count_chain(ssat, sid, CDF_SEC_SIZE(h)); scn->sst_dirlen = len; - if (scn->sst_len == (size_t)-1) + if (sst->sst_tab == NULL || scn->sst_len == (size_t)-1) return -1; scn->sst_tab = calloc(scn->sst_len, ss); @@ -629,22 +643,21 @@ cdf_read_short_stream(const cdf_info_t *info, const cdf_header_t *h, break; /* If the it is not there, just fake it; some docs don't have it */ - if (i == dir->dir_len) { - scn->sst_tab = NULL; - scn->sst_len = 0; - return 0; - } + if (i == dir->dir_len) + goto out; d = &dir->dir_tab[i]; /* If the it is not there, just fake it; some docs don't have it */ - if (d->d_stream_first_sector < 0) { - scn->sst_tab = NULL; - scn->sst_len = 0; - return 0; - } + if (d->d_stream_first_sector < 0) + goto out; return cdf_read_long_sector_chain(info, h, sat, d->d_stream_first_sector, d->d_size, scn); +out: + scn->sst_tab = NULL; + scn->sst_len = 0; + scn->sst_dirlen = 0; + return 0; } static int @@ -697,15 +710,27 @@ cdf_read_property_info(const cdf_stream_t *sst, uint32_t offs, size_t i, o, nelements, j; cdf_property_info_t *inp; + if (offs > UINT32_MAX / 4) { + errno = EFTYPE; + goto out; + } shp = (const void *)((const char *)sst->sst_tab + offs); + if (cdf_check_stream_offset(sst, shp, sizeof(*shp)) == -1) + goto out; sh.sh_len = CDF_TOLE4(shp->sh_len); +#define CDF_SHLEN_LIMIT (UINT32_MAX / 8) + if (sh.sh_len > CDF_SHLEN_LIMIT) { + errno = EFTYPE; + goto out; + } sh.sh_properties = CDF_TOLE4(shp->sh_properties); -#define CDF_PROP_LIM (UINT32_MAX / (4 * sizeof(*inp))) - if (sh.sh_properties > CDF_PROP_LIM) +#define CDF_PROP_LIMIT (UINT32_MAX / (4 * sizeof(*inp))) + if (sh.sh_properties > CDF_PROP_LIMIT) goto out; - DPRINTF(("section len: %u properties %u\n", sh.sh_len, sh.sh_properties)); + DPRINTF(("section len: %u properties %u\n", sh.sh_len, + sh.sh_properties)); if (*maxcount) { - if (*maxcount > CDF_PROP_LIM) + if (*maxcount > CDF_PROP_LIMIT) goto out; *maxcount += sh.sh_properties; inp = realloc(*info, *maxcount * sizeof(*inp)); @@ -720,6 +745,8 @@ cdf_read_property_info(const cdf_stream_t *sst, uint32_t offs, *count += sh.sh_properties; p = (const void *)((const char *)sst->sst_tab + offs + sizeof(sh)); e = (const void *)(((const char *)shp) + sh.sh_len); + if (cdf_check_stream_offset(sst, e, 0) == -1) + goto out; for (i = 0; i < sh.sh_properties; i++) { q = (const uint32_t *)((const char *)p + CDF_TOLE4(p[(i << 1) + 1])) - 2; @@ -777,8 +804,8 @@ cdf_read_property_info(const cdf_stream_t *sst, uint32_t offs, case CDF_LENGTH32_STRING: if (nelements > 1) { size_t nelem = inp - *info; - if (*maxcount > CDF_PROP_LIM - || nelements > CDF_PROP_LIM) + if (*maxcount > CDF_PROP_LIMIT + || nelements > CDF_PROP_LIMIT) goto out; *maxcount += nelements; inp = realloc(*info, *maxcount * sizeof(*inp)); @@ -832,6 +859,9 @@ cdf_unpack_summary_info(const cdf_stream_t *sst, cdf_summary_info_header_t *ssi, const cdf_section_declaration_t *sd = (const void *) ((const char *)sst->sst_tab + CDF_SECTION_DECLARATION_OFFSET); + if (cdf_check_stream_offset(sst, si, sizeof(*si)) == -1 || + cdf_check_stream_offset(sst, sd, sizeof(*sd)) == -1) + return -1; ssi->si_byte_order = CDF_TOLE2(si->si_byte_order); ssi->si_os_version = CDF_TOLE2(si->si_os_version); ssi->si_os = CDF_TOLE2(si->si_os); @@ -946,11 +976,13 @@ cdf_dump_header(const cdf_header_t *h) size_t i; #define DUMP(a, b) (void)fprintf(stderr, "%40.40s = " a "\n", # b, h->h_ ## b) +#define DUMP2(a, b) (void)fprintf(stderr, "%40.40s = " a " (" a ")\n", # b, \ + h->h_ ## b, 1 << h->h_ ## b) DUMP("%d", revision); DUMP("%d", version); DUMP("0x%x", byte_order); - DUMP("%d", sec_size_p2); - DUMP("%d", short_sec_size_p2); + DUMP2("%d", sec_size_p2); + DUMP2("%d", short_sec_size_p2); DUMP("%d", num_sectors_in_sat); DUMP("%d", secid_first_directory); DUMP("%d", min_size_standard_stream); @@ -1202,7 +1234,7 @@ main(int argc, char *argv[]) #endif - if (cdf_read_summary_info(&inf, &h, &sat, &ssat, &sst, &dir, + if (cdf_read_summary_info(&info, &h, &sat, &ssat, &sst, &dir, &scn) == -1) err(1, "Cannot read summary info"); #ifdef CDF_DEBUG diff --git a/ext/fileinfo/libmagic/cdf_time.c b/ext/fileinfo/libmagic/cdf_time.c index ac416ea2fe..36372966a7 100644 --- a/ext/fileinfo/libmagic/cdf_time.c +++ b/ext/fileinfo/libmagic/cdf_time.c @@ -27,7 +27,7 @@ #include "file.h" #ifndef lint -FILE_RCSID("@(#)$File: cdf_time.c,v 1.5 2009/02/03 20:27:51 christos Exp $") +FILE_RCSID("@(#)$File: cdf_time.c,v 1.6 2009/03/10 11:44:29 christos Exp $") #endif #include diff --git a/ext/fileinfo/libmagic/compress.c b/ext/fileinfo/libmagic/compress.c index 19ff67033b..de4de3401c 100644 --- a/ext/fileinfo/libmagic/compress.c +++ b/ext/fileinfo/libmagic/compress.c @@ -36,7 +36,7 @@ #include "file.h" #ifndef lint -FILE_RCSID("@(#)$File: compress.c,v 1.56 2008/02/07 00:58:52 christos Exp $") +FILE_RCSID("@(#)$File: compress.c,v 1.63 2009/03/23 14:21:51 christos Exp $") #endif #include "magic.h" @@ -86,11 +86,8 @@ private const struct { { "\3757zXZ\0",6,{ "xz", "-cd", NULL }, 1 }, /* XZ Utils */ }; -private size_t ncompr = sizeof(compr) / sizeof(compr[0]); - #define NODATA ((size_t)~0) - private ssize_t swrite(int, const void *, size_t); #ifdef PHP_FILEINFO_UNCOMPRESS private size_t uncompressbuf(struct magic_set *, int, size_t, @@ -108,10 +105,13 @@ file_zmagic(struct magic_set *ms, int fd, const char *name, size_t i, nsz; int rv = 0; int mime = ms->flags & MAGIC_MIME; + size_t ncompr; if ((ms->flags & MAGIC_COMPRESS) == 0) return 0; + ncompr = sizeof(compr) / sizeof(compr[0]); + for (i = 0; i < ncompr; i++) { if (nbytes < compr[i].maglen) continue; @@ -191,7 +191,6 @@ sread(int fd, void *buf, size_t n, int canbepipe) if ((canbepipe && (ioctl(fd, FIONREAD, &t) == -1)) || (t == 0)) { #ifdef FD_ZERO int cnt; - for (cnt = 0;; cnt++) { fd_set check; struct timeval tout = {0, 100 * 1000}; @@ -493,7 +492,7 @@ err: (void)wait(NULL); #endif (void) close(fdin[0]); - + return n; } } diff --git a/ext/fileinfo/libmagic/file.c b/ext/fileinfo/libmagic/file.c deleted file mode 100644 index 89d163284b..0000000000 --- a/ext/fileinfo/libmagic/file.c +++ /dev/null @@ -1,481 +0,0 @@ -/* - * Copyright (c) Ian F. Darwin 1986-1995. - * Software written by Ian F. Darwin and others; - * maintained 1995-present by Christos Zoulas and others. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice immediately at the beginning of the file, without modification, - * this list of conditions, and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ -/* - * file - find type of a file or files - main program. - */ - -#include "file.h" -#include "magic.h" - -#include -#include -#include -#include -#include -#include /* for MAXPATHLEN */ -#include -#ifdef RESTORE_TIME -# if (__COHERENT__ >= 0x420) -# include -# else -# ifdef USE_UTIMES -# include -# else -# include -# endif -# endif -#endif -#ifdef HAVE_UNISTD_H -#include /* for read() */ -#endif -#ifdef HAVE_LOCALE_H -#include -#endif -#ifdef HAVE_WCHAR_H -#include -#endif - -#include -#ifndef HAVE_GETOPT_LONG -int getopt_long(int argc, char * const *argv, const char *optstring, const struct option *longopts, int *longindex); -#endif - -#include /* for byte swapping */ - -#include "patchlevel.h" - -#ifndef lint -FILE_RCSID("@(#)$File: file.c,v 1.119 2008/02/07 00:58:52 christos Exp $") -#endif /* lint */ - - -#ifdef S_IFLNK -#define SYMLINKFLAG "Lh" -#else -#define SYMLINKFLAG "" -#endif - -# define USAGE "Usage: %s [-bcik" SYMLINKFLAG "nNrsvz0] [-e test] [-f namefile] [-F separator] [-m magicfiles] file...\n %s -C -m magicfiles\n" - -#ifndef MAXPATHLEN -#define MAXPATHLEN 512 -#endif - -private int /* Global command-line options */ - bflag = 0, /* brief output format */ - nopad = 0, /* Don't pad output */ - nobuffer = 0, /* Do not buffer stdout */ - nulsep = 0; /* Append '\0' to the separator */ - -private const char *magicfile = 0; /* where the magic is */ -private const char *default_magicfile = MAGIC; -private const char *separator = ":"; /* Default field separator */ - -private char *progname; /* used throughout */ - -private struct magic_set *magic; - -private void unwrap(char *); -private void usage(void); -private void help(void); - -int main(int, char *[]); -private void process(const char *, int); -private void load(const char *, int); - - -/* - * main - parse arguments and handle options - */ -int -main(int argc, char *argv[]) -{ - int c; - size_t i; - int action = 0, didsomefiles = 0, errflg = 0; - int flags = 0; - char *home, *usermagic; - struct stat sb; - static const char hmagic[] = "/.magic"; -#define OPTSTRING "bcCde:f:F:hikLm:nNprsvz0" - int longindex; - static const struct option long_options[] = - { -#define OPT(shortname, longname, opt, doc) \ - {longname, opt, NULL, shortname}, -#define OPT_LONGONLY(longname, opt, doc) \ - {longname, opt, NULL, 0}, -#include "file_opts.h" -#undef OPT -#undef OPT_LONGONLY - {0, 0, NULL, 0} -}; - - static const struct { - const char *name; - int value; - } nv[] = { - { "apptype", MAGIC_NO_CHECK_APPTYPE }, - { "ascii", MAGIC_NO_CHECK_ASCII }, - { "compress", MAGIC_NO_CHECK_COMPRESS }, - { "elf", MAGIC_NO_CHECK_ELF }, - { "soft", MAGIC_NO_CHECK_SOFT }, - { "tar", MAGIC_NO_CHECK_TAR }, - { "tokens", MAGIC_NO_CHECK_TOKENS }, - }; - - /* makes islower etc work for other langs */ - (void)setlocale(LC_CTYPE, ""); - -#ifdef __EMX__ - /* sh-like wildcard expansion! Shouldn't hurt at least ... */ - _wildcard(&argc, &argv); -#endif - - if ((progname = strrchr(argv[0], '/')) != NULL) - progname++; - else - progname = argv[0]; - - magicfile = default_magicfile; - if ((usermagic = getenv("MAGIC")) != NULL) - magicfile = usermagic; - else - if ((home = getenv("HOME")) != NULL) { - if ((usermagic = malloc(strlen(home) - + sizeof(hmagic))) != NULL) { - (void)strcpy(usermagic, home); - (void)strcat(usermagic, hmagic); - if (stat(usermagic, &sb)<0) - free(usermagic); - else - magicfile = usermagic; - } - } - -#ifdef S_IFLNK - flags |= getenv("POSIXLY_CORRECT") ? MAGIC_SYMLINK : 0; -#endif - while ((c = getopt_long(argc, argv, OPTSTRING, long_options, - &longindex)) != -1) - switch (c) { - case 0 : - switch (longindex) { - case 0: - help(); - break; - case 10: - flags |= MAGIC_MIME_TYPE; - break; - case 11: - flags |= MAGIC_MIME_ENCODING; - break; - } - break; - case '0': - nulsep = 1; - break; - case 'b': - bflag++; - break; - case 'c': - action = FILE_CHECK; - break; - case 'C': - action = FILE_COMPILE; - break; - case 'd': - flags |= MAGIC_DEBUG|MAGIC_CHECK; - break; - case 'e': - for (i = 0; i < sizeof(nv) / sizeof(nv[0]); i++) - if (strcmp(nv[i].name, optarg) == 0) - break; - - if (i == sizeof(nv) / sizeof(nv[0])) - errflg++; - else - flags |= nv[i].value; - break; - - case 'f': - if(action) - usage(); - load(magicfile, flags); - unwrap(optarg); - ++didsomefiles; - break; - case 'F': - separator = optarg; - break; - case 'i': - flags |= MAGIC_MIME; - break; - case 'k': - flags |= MAGIC_CONTINUE; - break; - case 'm': - magicfile = optarg; - break; - case 'n': - ++nobuffer; - break; - case 'N': - ++nopad; - break; -#if defined(HAVE_UTIME) || defined(HAVE_UTIMES) - case 'p': - flags |= MAGIC_PRESERVE_ATIME; - break; -#endif - case 'r': - flags |= MAGIC_RAW; - break; - case 's': - flags |= MAGIC_DEVICES; - break; - case 'v': - (void)fprintf(stderr, "%s-%d.%.2d\n", progname, - FILE_VERSION_MAJOR, patchlevel); - (void)fprintf(stderr, "magic file from %s\n", - magicfile); - return 1; - case 'z': - flags |= MAGIC_COMPRESS; - break; -#ifdef S_IFLNK - case 'L': - flags |= MAGIC_SYMLINK; - break; - case 'h': - flags &= ~MAGIC_SYMLINK; - break; -#endif - case '?': - default: - errflg++; - break; - } - - if (errflg) { - usage(); - } - - switch(action) { - case FILE_CHECK: - case FILE_COMPILE: - magic = magic_open(flags|MAGIC_CHECK); - if (magic == NULL) { - (void)fprintf(stderr, "%s: %s\n", progname, - strerror(errno)); - return 1; - } - c = action == FILE_CHECK ? magic_check(magic, magicfile) : - magic_compile(magic, magicfile); - if (c == -1) { - (void)fprintf(stderr, "%s: %s\n", progname, - magic_error(magic)); - return -1; - } - return 0; - default: - load(magicfile, flags); - break; - } - - if (optind == argc) { - if (!didsomefiles) { - usage(); - } - } - else { - size_t j, wid, nw; - for (wid = 0, j = (size_t)optind; j < (size_t)argc; j++) { - nw = file_mbswidth(argv[j]); - if (nw > wid) - wid = nw; - } - /* - * If bflag is only set twice, set it depending on - * number of files [this is undocumented, and subject to change] - */ - if (bflag == 2) { - bflag = optind >= argc - 1; - } - for (; optind < argc; optind++) - process(argv[optind], wid); - } - - c = magic->haderr ? 1 : 0; - magic_close(magic); - return c; -} - - -private void -/*ARGSUSED*/ -load(const char *m, int flags) -{ - if (magic || m == NULL) - return; - magic = magic_open(flags); - if (magic == NULL) { - (void)fprintf(stderr, "%s: %s\n", progname, strerror(errno)); - exit(1); - } - if (magic_load(magic, magicfile) == -1) { - (void)fprintf(stderr, "%s: %s\n", - progname, magic_error(magic)); - exit(1); - } -} - -/* - * unwrap -- read a file of filenames, do each one. - */ -private void -unwrap(char *fn) -{ - char buf[MAXPATHLEN]; - FILE *f; - int wid = 0, cwid; - - if (strcmp("-", fn) == 0) { - f = stdin; - wid = 1; - } else { - if ((f = fopen(fn, "r")) == NULL) { - (void)fprintf(stderr, "%s: Cannot open `%s' (%s).\n", - progname, fn, strerror(errno)); - exit(1); - } - - while (fgets(buf, MAXPATHLEN, f) != NULL) { - buf[strcspn(buf, "\n")] = '\0'; - cwid = file_mbswidth(buf); - if (cwid > wid) - wid = cwid; - } - - rewind(f); - } - - while (fgets(buf, sizeof(buf), f) != NULL) { - buf[strcspn(buf, "\n")] = '\0'; - process(buf, wid); - if(nobuffer) - (void)fflush(stdout); - } - - (void)fclose(f); -} - -/* - * Called for each input file on the command line (or in a list of files) - */ -private void -process(const char *inname, int wid) -{ - const char *type; - int std_in = strcmp(inname, "-") == 0; - - if (wid > 0 && !bflag) { - (void)printf("%s", std_in ? "/dev/stdin" : inname); - if (nulsep) - (void)putc('\0', stdout); - else - (void)printf("%s", separator); - (void)printf("%*s ", - (int) (nopad ? 0 : (wid - file_mbswidth(inname))), ""); - } - - type = magic_file(magic, std_in ? NULL : inname); - if (type == NULL) - (void)printf("ERROR: %s\n", magic_error(magic)); - else - (void)printf("%s\n", type); -} - -size_t -file_mbswidth(const char *s) -{ -#if defined(HAVE_WCHAR_H) && defined(HAVE_MBRTOWC) && defined(HAVE_WCWIDTH) - size_t bytesconsumed, old_n, n, width = 0; - mbstate_t state; - wchar_t nextchar; - (void)memset(&state, 0, sizeof(mbstate_t)); - old_n = n = strlen(s); - - while (n > 0) { - bytesconsumed = mbrtowc(&nextchar, s, n, &state); - if (bytesconsumed == (size_t)(-1) || - bytesconsumed == (size_t)(-2)) { - /* Something went wrong, return something reasonable */ - return old_n; - } - if (s[0] == '\n') { - /* - * do what strlen() would do, so that caller - * is always right - */ - width++; - } else - width += wcwidth(nextchar); - - s += bytesconsumed, n -= bytesconsumed; - } - return width; -#else - return strlen(s); -#endif -} - -private void -usage(void) -{ - (void)fprintf(stderr, USAGE, progname, progname); - (void)fputs("Try `file --help' for more information.\n", stderr); - exit(1); -} - -private void -help(void) -{ - (void)fputs( -"Usage: file [OPTION...] [FILE...]\n" -"Determine type of FILEs.\n" -"\n", stderr); -#define OPT(shortname, longname, opt, doc) \ - fprintf(stderr, " -%c, --" longname doc, shortname); -#define OPT_LONGONLY(longname, opt, doc) \ - fprintf(stderr, " --" longname doc); -#include "file_opts.h" -#undef OPT -#undef OPT_LONGONLY - exit(0); -} diff --git a/ext/fileinfo/libmagic/file.h b/ext/fileinfo/libmagic/file.h index 58211f1925..915602fa6f 100644 --- a/ext/fileinfo/libmagic/file.h +++ b/ext/fileinfo/libmagic/file.h @@ -2,7 +2,7 @@ * Copyright (c) Ian F. Darwin 1986-1995. * Software written by Ian F. Darwin and others; * maintained 1995-present by Christos Zoulas and others. - * + * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: @@ -12,7 +12,7 @@ * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. - * + * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE @@ -27,7 +27,7 @@ */ /* * file.h - definitions for file(1) program - * @(#)$File: file.h,v 1.103 2008/03/01 22:21:49 rrt Exp $ + * @(#)$File: file.h,v 1.119 2009/02/04 18:24:32 christos Exp $ */ #ifndef __file_h__ @@ -138,7 +138,7 @@ struct magic { #define UNSIGNED 0x08 /* comparison is unsigned */ #define NOSPACE 0x10 /* suppress space character before output */ #define BINTEST 0x20 /* test is for a binary type (set only - for top-level tests) */ + for top-level tests) */ #define TEXTTEST 0 /* for passing to file_softmagic */ uint8_t factor; @@ -216,7 +216,7 @@ struct magic { #else uint8_t dummy; #endif - uint8_t factor_op; + uint8_t factor_op; #define FILE_FACTOR_OP_PLUS '+' #define FILE_FACTOR_OP_MINUS '-' #define FILE_FACTOR_OP_TIMES '*' @@ -264,7 +264,7 @@ struct magic { #define str_range _u._s._count #define str_flags _u._s._flags /* Words 9-16 */ - union VALUETYPE value; /* either number of string */ + union VALUETYPE value; /* either number or string */ /* Words 17-24 */ char desc[MAXDESC]; /* description */ /* Words 25-32 */ @@ -312,7 +312,6 @@ struct level_info { int last_cond; /* used for error checking by parse() */ #endif }; - struct magic_set { struct mlist *mlist; struct cont { diff --git a/ext/fileinfo/libmagic/file_opts.h b/ext/fileinfo/libmagic/file_opts.h deleted file mode 100644 index 46bc08ae4b..0000000000 --- a/ext/fileinfo/libmagic/file_opts.h +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Table of command-line options - * - * The first column specifies the short name, if any, or 0 if none. - * The second column specifies the long name. - * The third column specifies whether it takes a parameter. - * The fourth column is the documentation. - * - * N.B. The long options' order must correspond to the code in file.c, - * and OPTSTRING must be kept up-to-date with the short options. - * Pay particular attention to the numbers of long-only options in the - * switch statement! - */ - -OPT_LONGONLY("help", 0, " display this help and exit\n") -OPT('v', "version", 0, " output version information and exit\n") -OPT('m', "magic-file", 1, " LIST use LIST as a colon-separated list of magic\n" - " number files\n") -OPT('z', "uncompress", 0, " try to look inside compressed files\n") -OPT('b', "brief", 0, " do not prepend filenames to output lines\n") -OPT('c', "checking-printout", 0, " print the parsed form of the magic file, use in\n" - " conjunction with -m to debug a new magic file\n" - " before installing it\n") -OPT('e', "exclude", 1, " TEST exclude TEST from the list of test to be\n" - " performed for file. Valid tests are:\n" - " ascii, apptype, compress, elf, soft, tar, tokens, troff\n") -OPT('f', "files-from", 1, " FILE read the filenames to be examined from FILE\n") -OPT('F', "separator", 1, " STRING use string as separator instead of `:'\n") -OPT('i', "mime", 0, " output MIME type strings (--mime-type and\n" - " --mime-encoding)\n") -OPT_LONGONLY("mime-type", 0, " output the MIME type\n") -OPT_LONGONLY("mime-encoding", 0, " output the MIME encoding\n") -OPT('k', "keep-going", 0, " don't stop at the first match\n") -#ifdef S_IFLNK -OPT('L', "dereference", 0, " follow symlinks (default)\n") -OPT('h', "no-dereference", 0, " don't follow symlinks\n") -#endif -OPT('n', "no-buffer", 0, " do not buffer output\n") -OPT('N', "no-pad", 0, " do not pad output\n") -OPT('0', "print0", 0, " terminate filenames with ASCII NUL\n") -#if defined(HAVE_UTIME) || defined(HAVE_UTIMES) -OPT('p', "preserve-date", 0, " preserve access times on files\n") -#endif -OPT('r', "raw", 0, " don't translate unprintable chars to \\ooo\n") -OPT('s', "special-files", 0, " treat special (block/char devices) files as\n" - " ordinary ones\n") -OPT('C', "compile", 0, " compile file specified by -m\n") -OPT('d', "debug", 0, " print debugging messages\n") diff --git a/ext/fileinfo/libmagic/funcs.c b/ext/fileinfo/libmagic/funcs.c index f36f9b29aa..3ca5408088 100644 --- a/ext/fileinfo/libmagic/funcs.c +++ b/ext/fileinfo/libmagic/funcs.c @@ -1,7 +1,7 @@ /* * Copyright (c) Christos Zoulas 2003. * All Rights Reserved. - * + * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: @@ -11,7 +11,7 @@ * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. - * + * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE @@ -27,7 +27,7 @@ #include "file.h" #ifndef lint -FILE_RCSID("@(#)$File: funcs.c,v 1.39 2008/03/01 22:21:49 rrt Exp $") +FILE_RCSID("@(#)$File: funcs.c,v 1.53 2009/04/07 11:07:00 christos Exp $") #endif /* lint */ #include "magic.h" @@ -392,7 +392,7 @@ file_getbuffer(struct magic_set *ms) for (np = ms->o.pbuf, op = ms->o.buf; *op; op++) { if (isprint((unsigned char)*op)) { - *np++ = *op; + *np++ = *op; } else { OCTALIFY(np, op); } diff --git a/ext/fileinfo/libmagic/getopt_long.c b/ext/fileinfo/libmagic/getopt_long.c deleted file mode 100644 index e6efd0f584..0000000000 --- a/ext/fileinfo/libmagic/getopt_long.c +++ /dev/null @@ -1,482 +0,0 @@ -/* $NetBSD: getopt_long.c,v 1.21.4.1 2008/01/09 01:34:14 matt Exp $ */ - -/*- - * Copyright (c) 2000 The NetBSD Foundation, Inc. - * All rights reserved. - * - * This code is derived from software contributed to The NetBSD Foundation - * by Dieter Baron and Thomas Klausner. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS - * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS - * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -#include -#include -#include -#include -#include -#include - -#define REPLACE_GETOPT - -#define _DIAGASSERT assert - -#ifdef REPLACE_GETOPT -#ifdef __weak_alias -__weak_alias(getopt,_getopt) -#endif -int opterr = 1; /* if error message should be printed */ -int optind = 1; /* index into parent argv vector */ -int optopt = '?'; /* character checked for validity */ -int optreset; /* reset getopt */ -char *optarg; /* argument associated with option */ -#elif HAVE_NBTOOL_CONFIG_H && !HAVE_DECL_OPTRESET -static int optreset; -#endif - -#ifdef __weak_alias -__weak_alias(getopt_long,_getopt_long) -#endif - -#define IGNORE_FIRST (*options == '-' || *options == '+') -#define PRINT_ERROR ((opterr) && ((*options != ':') \ - || (IGNORE_FIRST && options[1] != ':'))) -#define IS_POSIXLY_CORRECT (getenv("POSIXLY_CORRECT") != NULL) -#define PERMUTE (!IS_POSIXLY_CORRECT && !IGNORE_FIRST) -/* XXX: GNU ignores PC if *options == '-' */ -#define IN_ORDER (!IS_POSIXLY_CORRECT && *options == '-') - -/* return values */ -#define BADCH (int)'?' -#define BADARG ((IGNORE_FIRST && options[1] == ':') \ - || (*options == ':') ? (int)':' : (int)'?') -#define INORDER (int)1 - -#define EMSG "" - -static int getopt_internal __P((int, char **, const char *)); -static int gcd __P((int, int)); -static void permute_args __P((int, int, int, char **)); - -static const char *place = EMSG; /* option letter processing */ - -/* XXX: set optreset to 1 rather than these two */ -static int nonopt_start = -1; /* first non option argument (for permute) */ -static int nonopt_end = -1; /* first option after non options (for permute) */ - -/* Error messages */ -static const char recargchar[] = "option requires an argument -- %c"; -static const char recargstring[] = "option requires an argument -- %s"; -static const char ambig[] = "ambiguous option -- %.*s"; -static const char noarg[] = "option doesn't take an argument -- %.*s"; -static const char illoptchar[] = "unknown option -- %c"; -static const char illoptstring[] = "unknown option -- %s"; - - -/* - * Compute the greatest common divisor of a and b. - */ -static int -gcd(a, b) - int a; - int b; -{ - int c; - - c = a % b; - while (c != 0) { - a = b; - b = c; - c = a % b; - } - - return b; -} - -/* - * Exchange the block from nonopt_start to nonopt_end with the block - * from nonopt_end to opt_end (keeping the same order of arguments - * in each block). - */ -static void -permute_args(panonopt_start, panonopt_end, opt_end, nargv) - int panonopt_start; - int panonopt_end; - int opt_end; - char **nargv; -{ - int cstart, cyclelen, i, j, ncycle, nnonopts, nopts, pos; - char *swap; - - _DIAGASSERT(nargv != NULL); - - /* - * compute lengths of blocks and number and size of cycles - */ - nnonopts = panonopt_end - panonopt_start; - nopts = opt_end - panonopt_end; - ncycle = gcd(nnonopts, nopts); - cyclelen = (opt_end - panonopt_start) / ncycle; - - for (i = 0; i < ncycle; i++) { - cstart = panonopt_end+i; - pos = cstart; - for (j = 0; j < cyclelen; j++) { - if (pos >= panonopt_end) - pos -= nnonopts; - else - pos += nopts; - swap = nargv[pos]; - nargv[pos] = nargv[cstart]; - nargv[cstart] = swap; - } - } -} - -/* - * getopt_internal -- - * Parse argc/argv argument vector. Called by user level routines. - * Returns -2 if -- is found (can be long option or end of options marker). - */ -static int -getopt_internal(nargc, nargv, options) - int nargc; - char **nargv; - const char *options; -{ - char *oli; /* option letter list index */ - int optchar; - - _DIAGASSERT(nargv != NULL); - _DIAGASSERT(options != NULL); - - optarg = NULL; - - /* - * XXX Some programs (like rsyncd) expect to be able to - * XXX re-initialize optind to 0 and have getopt_long(3) - * XXX properly function again. Work around this braindamage. - */ - if (optind == 0) - optind = 1; - - if (optreset) - nonopt_start = nonopt_end = -1; -start: - if (optreset || !*place) { /* update scanning pointer */ - optreset = 0; - if (optind >= nargc) { /* end of argument vector */ - place = EMSG; - if (nonopt_end != -1) { - /* do permutation, if we have to */ - permute_args(nonopt_start, nonopt_end, - optind, nargv); - optind -= nonopt_end - nonopt_start; - } - else if (nonopt_start != -1) { - /* - * If we skipped non-options, set optind - * to the first of them. - */ - optind = nonopt_start; - } - nonopt_start = nonopt_end = -1; - return -1; - } - if ((*(place = nargv[optind]) != '-') - || (place[1] == '\0')) { /* found non-option */ - place = EMSG; - if (IN_ORDER) { - /* - * GNU extension: - * return non-option as argument to option 1 - */ - optarg = nargv[optind++]; - return INORDER; - } - if (!PERMUTE) { - /* - * if no permutation wanted, stop parsing - * at first non-option - */ - return -1; - } - /* do permutation */ - if (nonopt_start == -1) - nonopt_start = optind; - else if (nonopt_end != -1) { - permute_args(nonopt_start, nonopt_end, - optind, nargv); - nonopt_start = optind - - (nonopt_end - nonopt_start); - nonopt_end = -1; - } - optind++; - /* process next argument */ - goto start; - } - if (nonopt_start != -1 && nonopt_end == -1) - nonopt_end = optind; - if (place[1] && *++place == '-') { /* found "--" */ - place++; - return -2; - } - } - if ((optchar = (int)*place++) == (int)':' || - (oli = strchr(options + (IGNORE_FIRST ? 1 : 0), optchar)) == NULL) { - /* option letter unknown or ':' */ - if (!*place) - ++optind; - if (PRINT_ERROR) - warnx(illoptchar, optchar); - optopt = optchar; - return BADCH; - } - if (optchar == 'W' && oli[1] == ';') { /* -W long-option */ - /* XXX: what if no long options provided (called by getopt)? */ - if (*place) - return -2; - - if (++optind >= nargc) { /* no arg */ - place = EMSG; - if (PRINT_ERROR) - warnx(recargchar, optchar); - optopt = optchar; - return BADARG; - } else /* white space */ - place = nargv[optind]; - /* - * Handle -W arg the same as --arg (which causes getopt to - * stop parsing). - */ - return -2; - } - if (*++oli != ':') { /* doesn't take argument */ - if (!*place) - ++optind; - } else { /* takes (optional) argument */ - optarg = NULL; - if (*place) /* no white space */ - optarg = (char *)place; - /* XXX: disable test for :: if PC? (GNU doesn't) */ - else if (oli[1] != ':') { /* arg not optional */ - if (++optind >= nargc) { /* no arg */ - place = EMSG; - if (PRINT_ERROR) - warnx(recargchar, optchar); - optopt = optchar; - return BADARG; - } else - optarg = nargv[optind]; - } - place = EMSG; - ++optind; - } - /* dump back option letter */ - return optchar; -} - -#ifdef REPLACE_GETOPT -/* - * getopt -- - * Parse argc/argv argument vector. - * - * [eventually this will replace the real getopt] - */ -int -getopt(nargc, nargv, options) - int nargc; - char * const *nargv; - const char *options; -{ - int retval; - - _DIAGASSERT(nargv != NULL); - _DIAGASSERT(options != NULL); - - retval = getopt_internal(nargc, (char **)nargv, options); - if (retval == -2) { - ++optind; - /* - * We found an option (--), so if we skipped non-options, - * we have to permute. - */ - if (nonopt_end != -1) { - permute_args(nonopt_start, nonopt_end, optind, - (char **)nargv); - optind -= nonopt_end - nonopt_start; - } - nonopt_start = nonopt_end = -1; - retval = -1; - } - return retval; -} -#endif - -/* - * getopt_long -- - * Parse argc/argv argument vector. - */ -int -getopt_long(nargc, nargv, options, long_options, idx) - int nargc; - char * const *nargv; - const char *options; - const struct option *long_options; - int *idx; -{ - int retval; - -#define IDENTICAL_INTERPRETATION(_x, _y) \ - (long_options[(_x)].has_arg == long_options[(_y)].has_arg && \ - long_options[(_x)].flag == long_options[(_y)].flag && \ - long_options[(_x)].val == long_options[(_y)].val) - - _DIAGASSERT(nargv != NULL); - _DIAGASSERT(options != NULL); - _DIAGASSERT(long_options != NULL); - /* idx may be NULL */ - - retval = getopt_internal(nargc, (char **)nargv, options); - if (retval == -2) { - char *current_argv, *has_equal; - size_t current_argv_len; - int i, ambiguous, match; - - current_argv = (char *)place; - match = -1; - ambiguous = 0; - - optind++; - place = EMSG; - - if (*current_argv == '\0') { /* found "--" */ - /* - * We found an option (--), so if we skipped - * non-options, we have to permute. - */ - if (nonopt_end != -1) { - permute_args(nonopt_start, nonopt_end, - optind, (char **)nargv); - optind -= nonopt_end - nonopt_start; - } - nonopt_start = nonopt_end = -1; - return -1; - } - if ((has_equal = strchr(current_argv, '=')) != NULL) { - /* argument found (--option=arg) */ - current_argv_len = has_equal - current_argv; - has_equal++; - } else - current_argv_len = strlen(current_argv); - - for (i = 0; long_options[i].name; i++) { - /* find matching long option */ - if (strncmp(current_argv, long_options[i].name, - current_argv_len)) - continue; - - if (strlen(long_options[i].name) == - (unsigned)current_argv_len) { - /* exact match */ - match = i; - ambiguous = 0; - break; - } - if (match == -1) /* partial match */ - match = i; - else if (!IDENTICAL_INTERPRETATION(i, match)) - ambiguous = 1; - } - if (ambiguous) { - /* ambiguous abbreviation */ - if (PRINT_ERROR) - warnx(ambig, (int)current_argv_len, - current_argv); - optopt = 0; - return BADCH; - } - if (match != -1) { /* option found */ - if (long_options[match].has_arg == no_argument - && has_equal) { - if (PRINT_ERROR) - warnx(noarg, (int)current_argv_len, - current_argv); - /* - * XXX: GNU sets optopt to val regardless of - * flag - */ - if (long_options[match].flag == NULL) - optopt = long_options[match].val; - else - optopt = 0; - return BADARG; - } - if (long_options[match].has_arg == required_argument || - long_options[match].has_arg == optional_argument) { - if (has_equal) - optarg = has_equal; - else if (long_options[match].has_arg == - required_argument) { - /* - * optional argument doesn't use - * next nargv - */ - optarg = nargv[optind++]; - } - } - if ((long_options[match].has_arg == required_argument) - && (optarg == NULL)) { - /* - * Missing argument; leading ':' - * indicates no error should be generated - */ - if (PRINT_ERROR) - warnx(recargstring, current_argv); - /* - * XXX: GNU sets optopt to val regardless - * of flag - */ - if (long_options[match].flag == NULL) - optopt = long_options[match].val; - else - optopt = 0; - --optind; - return BADARG; - } - } else { /* unknown option */ - if (PRINT_ERROR) - warnx(illoptstring, current_argv); - optopt = 0; - return BADCH; - } - if (long_options[match].flag) { - *long_options[match].flag = long_options[match].val; - retval = 0; - } else - retval = long_options[match].val; - if (idx) - *idx = match; - } - return retval; -#undef IDENTICAL_INTERPRETATION -} diff --git a/ext/fileinfo/libmagic/is_tar.c b/ext/fileinfo/libmagic/is_tar.c index 9802877e8c..f962edbd8e 100644 --- a/ext/fileinfo/libmagic/is_tar.c +++ b/ext/fileinfo/libmagic/is_tar.c @@ -40,7 +40,7 @@ #include "file.h" #ifndef lint -FILE_RCSID("@(#)$File: is_tar.c,v 1.31 2008/02/04 20:51:17 christos Exp $") +FILE_RCSID("@(#)$File: is_tar.c,v 1.36 2009/02/03 20:27:51 christos Exp $") #endif #include "magic.h" diff --git a/ext/fileinfo/libmagic/magic.c b/ext/fileinfo/libmagic/magic.c index e573922faa..849896bc83 100644 --- a/ext/fileinfo/libmagic/magic.c +++ b/ext/fileinfo/libmagic/magic.c @@ -1,7 +1,7 @@ /* * Copyright (c) Christos Zoulas 2003. * All Rights Reserved. - * + * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: @@ -11,7 +11,7 @@ * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. - * + * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE @@ -28,7 +28,7 @@ #include "file.h" #ifndef lint -FILE_RCSID("@(#)$File: magic.c,v 1.50 2008/02/19 00:58:59 rrt Exp $") +FILE_RCSID("@(#)$File: magic.c,v 1.62 2009/03/20 21:25:41 christos Exp $") #endif /* lint */ #include "magic.h" @@ -68,7 +68,7 @@ FILE_RCSID("@(#)$File: magic.c,v 1.50 2008/02/19 00:58:59 rrt Exp $") #include "patchlevel.h" -#ifndef PIPE_BUF +#ifndef PIPE_BUF /* Get the PIPE_BUF from pathconf */ #ifdef _PC_PIPE_BUF #define PIPE_BUF pathconf(".", _PC_PIPE_BUF) diff --git a/ext/fileinfo/libmagic/magic.h b/ext/fileinfo/libmagic/magic.h index 2e0fdc3921..ba037921d3 100644 --- a/ext/fileinfo/libmagic/magic.h +++ b/ext/fileinfo/libmagic/magic.h @@ -1,7 +1,7 @@ /* * Copyright (c) Christos Zoulas 2003. * All Rights Reserved. - * + * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: @@ -11,7 +11,7 @@ * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. - * + * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE diff --git a/ext/fileinfo/libmagic/print.c b/ext/fileinfo/libmagic/print.c index acba041bcc..fd10126b1f 100644 --- a/ext/fileinfo/libmagic/print.c +++ b/ext/fileinfo/libmagic/print.c @@ -34,7 +34,7 @@ #include "file.h" #ifndef lint -FILE_RCSID("@(#)$File: print.c,v 1.63 2008/02/17 19:28:54 rrt Exp $") +FILE_RCSID("@(#)$File: print.c,v 1.66 2009/02/03 20:27:51 christos Exp $") #endif /* lint */ #include diff --git a/ext/fileinfo/libmagic/readcdf.c b/ext/fileinfo/libmagic/readcdf.c index cf7ee0be4f..56d6504039 100644 --- a/ext/fileinfo/libmagic/readcdf.c +++ b/ext/fileinfo/libmagic/readcdf.c @@ -26,7 +26,7 @@ #include "file.h" #ifndef lint -FILE_RCSID("@(#)$File: readcdf.c,v 1.11 2009/02/03 20:27:51 christos Exp $") +FILE_RCSID("@(#)$File: readcdf.c,v 1.18 2009/05/06 20:48:22 christos Exp $") #endif #include @@ -200,7 +200,7 @@ protected int file_trycdf(struct magic_set *ms, int fd, const unsigned char *buf, size_t nbytes) { - cdf_info_t info; + cdf_info_t info; cdf_header_t h; cdf_sat_t sat, ssat; cdf_stream_t sst, scn; @@ -244,7 +244,6 @@ file_trycdf(struct magic_set *ms, int fd, const unsigned char *buf, expn = "Cannot read short stream"; goto out3; } - #ifdef CDF_DEBUG cdf_dump_dir(&info, &h, &sat, &ssat, &sst, &dir); #endif diff --git a/ext/fileinfo/libmagic/readelf.c b/ext/fileinfo/libmagic/readelf.c index 1e34b4b6e7..5429b503b4 100644 --- a/ext/fileinfo/libmagic/readelf.c +++ b/ext/fileinfo/libmagic/readelf.c @@ -27,7 +27,7 @@ #include "file.h" #ifndef lint -FILE_RCSID("@(#)$File: readelf.c,v 1.73 2008/03/27 22:00:28 christos Exp $") +FILE_RCSID("@(#)$File: readelf.c,v 1.81 2008/11/04 16:38:28 christos Exp $") #endif #ifdef BUILTIN_ELF diff --git a/ext/fileinfo/libmagic/softmagic.c b/ext/fileinfo/libmagic/softmagic.c index 2dea6ab15a..0a06d00f8a 100644 --- a/ext/fileinfo/libmagic/softmagic.c +++ b/ext/fileinfo/libmagic/softmagic.c @@ -2,7 +2,7 @@ * Copyright (c) Ian F. Darwin 1986-1995. * Software written by Ian F. Darwin and others; * maintained 1995-present by Christos Zoulas and others. - * + * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: @@ -12,7 +12,7 @@ * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. - * + * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE @@ -32,7 +32,7 @@ #include "file.h" #ifndef lint -FILE_RCSID("@(#)$File: softmagic.c,v 1.117 2008/03/01 22:21:49 rrt Exp $") +FILE_RCSID("@(#)$File: softmagic.c,v 1.135 2009/03/27 22:42:49 christos Exp $") #endif /* lint */ #include "magic.h" @@ -149,7 +149,7 @@ match(struct magic_set *ms, struct magic *magic, uint32_t nmagic, default: if (m->type == FILE_INDIRECT) returnval = 1; - + switch (magiccheck(ms, m)) { case -1: return -1; @@ -163,7 +163,7 @@ match(struct magic_set *ms, struct magic *magic, uint32_t nmagic, break; } if (flush) { - /* + /* * main entry didn't match, * flush its continuations */ @@ -188,7 +188,7 @@ match(struct magic_set *ms, struct magic *magic, uint32_t nmagic, if (print && mprint(ms, m) == -1) - return -1; + return -1; ms->c.li[cont_level].off = moffset(ms, m); @@ -227,7 +227,7 @@ match(struct magic_set *ms, struct magic *magic, uint32_t nmagic, return -1; case 0: if (m->reln != '!') - continue; + continue; flush = 1; break; default: @@ -305,11 +305,11 @@ match(struct magic_set *ms, struct magic *magic, uint32_t nmagic, if (printed_something) { firstline = 0; if (print) - returnval = 1; + returnval = 1; } if ((ms->flags & MAGIC_CONTINUE) == 0 && printed_something) { return returnval; /* don't keep searching */ - } + } } return returnval; /* This is hit if -k is set or there is no match */ } @@ -377,7 +377,8 @@ mprint(struct magic_set *ms, struct magic *m) return -1; break; default: - if (file_printf(ms, m->desc, (unsigned short) v) == -1) + if ( + file_printf(ms, m->desc, (unsigned short) v) == -1) return -1; break; } @@ -932,7 +933,7 @@ mcopy(struct magic_set *ms, union VALUETYPE *p, int type, int indir, } if (lines) last = (const char *)s + nbytes; - + ms->search.s = buf; ms->search.s_len = last - buf; ms->search.offset = offset; @@ -945,10 +946,10 @@ mcopy(struct magic_set *ms, union VALUETYPE *p, int type, int indir, const unsigned char *esrc = s + nbytes; char *dst = p->s; char *edst = &p->s[sizeof(p->s) - 1]; - + if (type == FILE_BESTRING16) src++; - + /* check for pointer overflow */ if (src < s) { file_magerror(ms, "invalid offset %u in mcopy()", @@ -1506,14 +1507,14 @@ mget(struct magic_set *ms, const unsigned char *s, if (nbytes < (offset + 1)) /* should alway be true */ return 0; break; - + case FILE_SHORT: case FILE_BESHORT: case FILE_LESHORT: if (nbytes < (offset + 2)) return 0; break; - + case FILE_LONG: case FILE_BELONG: case FILE_LELONG: @@ -1532,7 +1533,7 @@ mget(struct magic_set *ms, const unsigned char *s, if (nbytes < (offset + 4)) return 0; break; - + case FILE_DOUBLE: case FILE_BEDOUBLE: case FILE_LEDOUBLE: @@ -1591,7 +1592,7 @@ file_strncmp(const char *s1, const char *s2, size_t len, uint32_t flags) if (0L == flags) { /* normal string: do it fast */ while (len-- > 0) if ((v = *b++ - *a++) != '\0') - break; + break; } else { /* combine the others */ while (len-- > 0) { @@ -1605,8 +1606,8 @@ file_strncmp(const char *s1, const char *s2, size_t len, uint32_t flags) if ((v = toupper(*b++) - *a++) != '\0') break; } - else if ((flags & STRING_COMPACT_BLANK) && - isspace(*a)) { + else if ((flags & STRING_COMPACT_BLANK) && + isspace(*a)) { a++; if (isspace(*b++)) { while (isspace(*b)) @@ -1761,23 +1762,23 @@ magiccheck(struct magic_set *ms, struct magic *m) case 'x': matched = 1; break; - + case '!': matched = fv != fl; break; - + case '=': matched = fv == fl; break; - + case '>': matched = fv > fl; break; - + case '<': matched = fv < fl; break; - + default: matched = 0; file_magerror(ms, "cannot happen with float: invalid relation `%c'", @@ -1795,23 +1796,23 @@ magiccheck(struct magic_set *ms, struct magic *m) case 'x': matched = 1; break; - + case '!': matched = dv != dl; break; - + case '=': matched = dv == dl; break; - + case '>': matched = dv > dl; break; - + case '<': matched = dv < dl; break; - + default: matched = 0; file_magerror(ms, "cannot happen with double: invalid relation `%c'", m->reln); @@ -1859,7 +1860,6 @@ magiccheck(struct magic_set *ms, struct magic *m) } break; } - case FILE_REGEX: { zval *pattern; int options = 0; @@ -1867,9 +1867,7 @@ magiccheck(struct magic_set *ms, struct magic *m) TSRMLS_FETCH(); MAKE_STD_ZVAL(pattern); - Z_STRVAL_P(pattern) = (char *)m->value.s; - Z_STRLEN_P(pattern) = m->vallen; - Z_TYPE_P(pattern) = IS_STRING; + ZVAL_STRINGL(pattern, (char *)m->value.s, m->vallen, 0); options |= PCRE_MULTILINE; @@ -1878,8 +1876,14 @@ magiccheck(struct magic_set *ms, struct magic *m) } convert_libmagic_pattern(pattern, options); - + +#if (PHP_MAJOR_VERSION < 6) + if ((pce = pcre_get_compiled_regex_cache(Z_STRVAL_P(pattern), Z_STRLEN_P(pattern) TSRMLS_CC)) == NULL) { +#else if ((pce = pcre_get_compiled_regex_cache(IS_STRING, Z_STRVAL_P(pattern), Z_STRLEN_P(pattern) TSRMLS_CC)) == NULL) { +#endif + zval_dtor(pattern); + FREE_ZVAL(pattern); return -1; } else { /* pce now contains the compiled regex */ @@ -1894,16 +1898,19 @@ magiccheck(struct magic_set *ms, struct magic *m) haystack = estrndup(ms->search.s, ms->search.s_len); /* match v = 0, no match v = 1 */ +#if (PHP_MAJOR_VERSION < 6) + php_pcre_match_impl(pce, haystack, ms->search.s_len, retval, subpats, 1, 1, PREG_OFFSET_CAPTURE, 0 TSRMLS_CC); +#else php_pcre_match_impl(pce, IS_STRING, haystack, ms->search.s_len, retval, subpats, 1, 1, PREG_OFFSET_CAPTURE, 0 TSRMLS_CC); - +#endif /* Free haystack */ efree(haystack); if (Z_LVAL_P(retval) < 0) { zval_ptr_dtor(&subpats); FREE_ZVAL(retval); - efree(Z_STRVAL_P(pattern)); - efree(pattern); + zval_dtor(pattern); + FREE_ZVAL(pattern); return -1; } else if ((Z_LVAL_P(retval) > 0) && (Z_TYPE_P(subpats) == IS_ARRAY)) { @@ -1991,8 +1998,8 @@ magiccheck(struct magic_set *ms, struct magic *m) } else { zval_ptr_dtor(&subpats); FREE_ZVAL(retval); - efree(Z_STRVAL_P(pattern)); - efree(pattern); + zval_dtor(pattern); + FREE_ZVAL(pattern); return -1; } } @@ -2004,8 +2011,8 @@ magiccheck(struct magic_set *ms, struct magic *m) zval_ptr_dtor(&subpats); FREE_ZVAL(retval); } - efree(Z_STRVAL_P(pattern)); - efree(pattern); + zval_dtor(pattern); + FREE_ZVAL(pattern); break; } case FILE_INDIRECT: @@ -2123,7 +2130,7 @@ print_sep(struct magic_set *ms, int firstline) if (firstline) return 0; /* - * we found another match + * we found another match * put a newline and '-' to do some simple formatting */ return file_printf(ms, "\n- ");