php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login | |
Patch bug63248.patch for *General Issues Bug #63248Patch version 2012-10-10 17:51 UTC Return to Bug #63248 | Download this patchThis patch is obsolete Obsoleted by patches: Patch Revisions:
Developer: ab@php.netdiff --git a/ext/fileinfo/libmagic/apprentice.c b/ext/fileinfo/libmagic/apprentice.c index d11bd15..ff14ca0 100644 --- a/ext/fileinfo/libmagic/apprentice.c +++ b/ext/fileinfo/libmagic/apprentice.c @@ -759,8 +759,10 @@ apprentice_load(struct magic_set *ms, struct magic **magicp, uint32_t *nmagicp, size_t files = 0, maxfiles = 0; char **filearr = NULL; struct stat st; +#ifndef PHP_WIN32 DIR *dir; struct dirent *d; +#endif ms->flags |= MAGIC_CHECK; /* Enable checks for parsed files */ @@ -776,19 +778,50 @@ apprentice_load(struct magic_set *ms, struct magic **magicp, uint32_t *nmagicp, /* FIXME: Read file names and sort them to prevent non-determinism. See Debian bug #488562. */ if (php_sys_stat(fn, &st) == 0 && S_ISDIR(st.st_mode)) { - int mflen; - char mfn[MAXPATHLEN]; +#ifdef PHP_WIN32 + HANDLE hf; + WIN32_FIND_DATA wfd; + char *winfn, *sl; + size_t winfn_len; + int suf_len; +#endif + int mflen; + char mfn[MAXPATHLEN]; + +#ifdef PHP_WIN32 +# define FINFO_FOUND_MAGIC_NAME wfd.cFileName + winfn_len = strlen(fn); + suf_len = ('\\' == fn[winfn_len-1]) ? 2 : 3; + sl = ('\\' == fn[winfn_len-1]) ? "" : "\\"; + + winfn = (char *)emalloc(sizeof(char)*(winfn_len+suf_len)); + sprintf(winfn, "%s%s*", fn, sl); + winfn[winfn_len+suf_len-1] = '\0'; + + if ((hf = FindFirstFile(winfn, &wfd)) == INVALID_HANDLE_VALUE) { + errs++; + goto out; + } + + while (FindNextFile(hf, &wfd)) { +#else +# define FINFO_FOUND_MAGIC_NAME d->d_name dir = opendir(fn); if (!dir) { errs++; goto out; } while ((d = readdir(dir)) != NULL) { - if ((mflen = snprintf(mfn, sizeof(mfn), "%s/%s", fn, d->d_name)) < 0) { +#endif + if ((mflen = snprintf(mfn, sizeof(mfn), "%s/%s", fn, FINFO_FOUND_MAGIC_NAME)) < 0) { file_oomem(ms, - strlen(fn) + strlen(d->d_name) + 2); + strlen(fn) + strlen(FINFO_FOUND_MAGIC_NAME) + 2); errs++; +#ifdef PHP_WIN32 + efree(winfn); +#else closedir(dir); +#endif goto out; } if (stat(mfn, &st) == -1 || !S_ISREG(st.st_mode)) { @@ -801,14 +834,22 @@ apprentice_load(struct magic_set *ms, struct magic **magicp, uint32_t *nmagicp, if ((filearr = CAST(char **, realloc(filearr, mlen))) == NULL) { file_oomem(ms, mlen); +#ifdef PHP_WIN32 + efree(winfn); +#else closedir(dir); +#endif errs++; goto out; } } filearr[files++] = estrndup(mfn, (mflen > sizeof(mfn) - 1)? sizeof(mfn) - 1: mflen); } +#ifdef PHP_WIN32 + efree(winfn); +#else closedir(dir); +#endif qsort(filearr, files, sizeof(*filearr), cmpstrp); for (i = 0; i < files; i++) { load_1(ms, action, filearr[i], &errs, &marray, @@ -2206,6 +2247,14 @@ apprentice_map(struct magic_set *ms, struct magic **magicp, uint32_t *nmagicp, goto internal_loaded; } +#ifdef PHP_WIN32 + if (php_stream_stat_path_ex(fn, 0, &st, NULL) == SUCCESS) { + if (st.sb.st_mode & S_IFDIR) { + goto error2; + } + } +#endif + dbname = mkdbname(ms, fn, 0); if (dbname == NULL) goto error2; |
Copyright © 2001-2024 The PHP Group All rights reserved. |
Last updated: Thu Nov 21 14:01:29 2024 UTC |