php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Return to Bug #63248
Patch bug63248.patch revision 2012-10-13 21:08 UTC by ab@php.net
revision 2012-10-11 15:42 UTC by ab@php.net
revision 2012-10-10 17:51 UTC by ab@php.net

Patch bug63248.patch for *General Issues Bug #63248

Patch version 2012-10-10 17:51 UTC

Return to Bug #63248 | Download this patch
This 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;
 
PHP Copyright © 2001-2014 The PHP Group
All rights reserved.
Last updated: Fri Apr 18 10:03:03 2014 UTC