]> granicus.if.org Git - php/commitdiff
Bug#54016 (finfo_file() Cannot determine filetype in archives)
authorHannes Magnusson <bjori@php.net>
Mon, 14 Feb 2011 15:32:02 +0000 (15:32 +0000)
committerHannes Magnusson <bjori@php.net>
Mon, 14 Feb 2011 15:32:02 +0000 (15:32 +0000)
ext/fileinfo/fileinfo.c
ext/fileinfo/tests/finfo_file_001.phpt
ext/fileinfo/tests/finfo_file_002.phpt
ext/fileinfo/tests/finfo_file_stream_001.phpt [new file with mode: 0644]
ext/fileinfo/tests/mime_content_type_001.phpt
ext/fileinfo/tests/resources/dir.zip [new file with mode: 0644]

index b2697260d25e48c9ce593cb420e87d27a8523131..398659b8e3ced9368313655f6fcaafd587577a23 100644 (file)
@@ -478,7 +478,7 @@ static void _php_finfo_get_type(INTERNAL_FUNCTION_PARAMETERS, int mode, int mime
                        /* determine if the file is a local file or remote URL */
                        char *tmp2;
                        php_stream_wrapper *wrap;
-                       struct stat sb;
+                       php_stream_statbuf ssb;
 
                        if (buffer == NULL || !*buffer) {
                                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Empty filename or path");
@@ -486,17 +486,6 @@ static void _php_finfo_get_type(INTERNAL_FUNCTION_PARAMETERS, int mode, int mime
                                goto clean;
                        }
 
-                       if (php_sys_stat(buffer, &sb) == 0) {
-                                         if (sb.st_mode & _S_IFDIR) {
-                                                                ret_val = mime_directory;
-                                                                goto common;
-                                         }
-                       } else {
-                               php_error_docref(NULL TSRMLS_CC, E_WARNING, "File or path not found '%s'", buffer);
-                               RETVAL_FALSE;
-                               goto clean;
-                       }
-
                        wrap = php_stream_locate_url_wrapper(buffer, &tmp2, 0 TSRMLS_CC);
 
                        if (wrap) {
@@ -512,7 +501,14 @@ static void _php_finfo_get_type(INTERNAL_FUNCTION_PARAMETERS, int mode, int mime
                                        goto clean;
                                }
 
-                               ret_val = (char *)magic_stream(magic, stream);
+                               if (php_stream_stat(stream, &ssb) == SUCCESS) {
+                                       if (ssb.sb.st_mode & S_IFDIR) {
+                                               ret_val = mime_directory;
+                                       } else {
+                                               ret_val = (char *)magic_stream(magic, stream);
+                                       }
+                               }
+
                                php_stream_close(stream);
                        }
                        break;
index 7452b5265b695a4dbe4b1f30dba8a94b4647ff54..263230321ae6aec3b021e712c7e4fcfac06955ff 100644 (file)
@@ -24,5 +24,5 @@ Warning: finfo_file(): Empty filename or path in %s on line %d
 bool(false)
 string(9) "directory"
 
-Warning: finfo_file(): File or path not found '&' in %s on line %d
+Warning: finfo_file(&): failed to open stream: No such file or directory in %s on line %d
 bool(false)
index 6b8ae28ceb846891718aca12125c7744fe4cfc01..9ed19a9762eea23dc5c576a9a85ba916f0d2de32 100644 (file)
@@ -18,7 +18,9 @@ ksort($results);
 var_dump($results);
 ?>
 --EXPECTF--
-array(5) {
+array(6) {
+  ["%s/resources/dir.zip"]=>
+  string(15) "application/zip"
   ["%s/resources/test.bmp"]=>
   string(14) "image/x-ms-bmp"
   ["%s/resources/test.gif"]=>
diff --git a/ext/fileinfo/tests/finfo_file_stream_001.phpt b/ext/fileinfo/tests/finfo_file_stream_001.phpt
new file mode 100644 (file)
index 0000000..5535259
--- /dev/null
@@ -0,0 +1,26 @@
+--TEST--
+finfo_file(): Files and directories inside an stream
+--SKIPIF--
+<?php require_once(dirname(__FILE__) . '/skipif.inc'); ?>
+<?php if (!extension_loaded('zip')) { die("skip"); } ?>
+--FILE--
+<?php
+
+$fp = finfo_open(FILEINFO_MIME_TYPE);
+$results = array();
+
+$zip = __DIR__ . "/resources/dir.zip";
+$stream = "zip://" . __DIR__ . "/resources/dir.zip";
+$dir = $stream . "#dir/";
+$png = $stream . "#dir/test.png";
+
+var_dump(
+         finfo_file($fp, $zip),
+         finfo_file($fp, $dir),
+         finfo_file($fp, $png)
+);
+?>
+--EXPECTF--
+string(15) "application/zip"
+string(9) "directory"
+string(9) "image/png"
index 5adab8f53ca0c75db9cbcc6be196debe7a8f8f01..72dd201007f5bc210eaf8728498d6412e2dc1c64 100644 (file)
@@ -23,7 +23,7 @@ Warning: mime_content_type(): Can only process string or stream arguments in %s
 
 Warning: mime_content_type(): Can only process string or stream arguments in %s on line %d
 
-Warning: mime_content_type(): File or path not found 'foo/inexistent' in %s on line %d
+Warning: mime_content_type(foo/inexistent): failed to open stream: No such file or directory in %s on line %d
 
 Warning: mime_content_type(): Empty filename or path in %s on line %d
 
diff --git a/ext/fileinfo/tests/resources/dir.zip b/ext/fileinfo/tests/resources/dir.zip
new file mode 100644 (file)
index 0000000..f133b96
Binary files /dev/null and b/ext/fileinfo/tests/resources/dir.zip differ