|
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.net
diff --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-2025 The PHP GroupAll rights reserved. |
Last updated: Thu Nov 20 20:00:02 2025 UTC |