cvs: php-src(PHP_5_3) /ext/fileinfo fileinfo.c /ext/fileinfo/libmagic magic.c /ext/fileinfo/tests finfo_file_001.phpt
| From: | Pierre-Alain Joye | Date: | Tue, 02 Sep 2008 10:15:55 +0000 |
| Subject: | cvs: php-src(PHP_5_3) /ext/fileinfo fileinfo.c /ext/fileinfo/libmagic magic.c /ext/fileinfo/tests finfo_file_001.phpt | ||
| Groups: | php.cvs | ||
| Request: | Send a blank email to php-cvs+get-52900@lists.php.net to get a copy of this message | ||
pajoye Tue Sep 2 10:15:55 2008 UTC
Modified files: (Branch: PHP_5_3)
/php-src/ext/fileinfo fileinfo.c
/php-src/ext/fileinfo/libmagic magic.c
/php-src/ext/fileinfo/tests finfo_file_001.phpt
Log:
- don't close caller streams in libmagic (prevent leak and zombie stream)
- string returned by magic_* are freed on magic_close, duplicate before
calling magic_close (set return value)
- if stat failed, don't try to call magic_* (when FILEINFO_MODE_FILE)
http://cvs.php.net/viewvc.cgi/php-src/ext/fileinfo/fileinfo.c?r1=1.20.2.11&r2=1.20.2.12&diff_format=u
Index: php-src/ext/fileinfo/fileinfo.c
diff -u php-src/ext/fileinfo/fileinfo.c:1.20.2.11 php-src/ext/fileinfo/fileinfo.c:1.20.2.12
--- php-src/ext/fileinfo/fileinfo.c:1.20.2.11 Mon Sep 1 23:44:00 2008
+++ php-src/ext/fileinfo/fileinfo.c Tue Sep 2 10:15:54 2008
@@ -16,7 +16,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: fileinfo.c,v 1.20.2.11 2008/09/01 23:44:00 felipe Exp $ */
+/* $Id: fileinfo.c,v 1.20.2.12 2008/09/02 10:15:54 pajoye Exp $ */
#ifdef HAVE_CONFIG_H
#include "config.h"
@@ -452,10 +452,8 @@
magic = magic_open(MAGIC_MIME);
if (magic_load(magic, NULL) == -1) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Failed to load magic database.");
- magic_close(magic);
- RETURN_FALSE;
+ goto common;
}
-
} else if (object) {
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|lr", &buffer,
&buffer_len, &options, &zcontext) == FAILURE) {
RETURN_FALSE;
@@ -508,12 +506,19 @@
if (buffer == NULL || !*buffer) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Empty filename or path");
- RETURN_FALSE;
+ RETVAL_FALSE;
+ goto clean;
}
- if (php_sys_stat(buffer, &sb) == 0 && (sb.st_mode & _S_IFDIR)) {
- ret_val = mime_directory;
- goto common;
+ 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);
@@ -524,10 +529,8 @@
php_stream *stream = php_stream_open_wrapper_ex(buffer, "rb", ENFORCE_SAFE_MODE |
REPORT_ERRORS, NULL, context);
if (!stream) {
- if (mimetype_emu) {
- magic_close(magic);
- }
- RETURN_FALSE;
+ RETVAL_FALSE;
+ goto clean;
}
ret_val = magic_stream(magic, stream);
@@ -538,27 +541,26 @@
default:
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Can only process string or stream
arguments");
- RETURN_FALSE;
}
common:
+ if (ret_val) {
+ RETVAL_STRING(ret_val, 1);
+ } else {
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "Failed identify data %d:%s",
magic_errno(magic), magic_error(magic));
+ RETVAL_FALSE;
+ }
+
+clean:
if (mimetype_emu) {
- if (magic) {
- magic_close(magic);
- }
+ magic_close(magic);
}
/* Restore options */
if (options) {
FINFO_SET_OPTION(magic, finfo->options)
}
-
- if (!ret_val) {
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "Failed identify data %d:%s",
magic_errno(magic), magic_error(magic));
- RETURN_FALSE;
- } else {
- RETURN_STRING(ret_val, 1);
- }
+ return;
}
/* }}} */
http://cvs.php.net/viewvc.cgi/php-src/ext/fileinfo/libmagic/magic.c?r1=1.1.2.3&r2=1.1.2.4&diff_format=u
Index: php-src/ext/fileinfo/libmagic/magic.c
diff -u php-src/ext/fileinfo/libmagic/magic.c:1.1.2.3 php-src/ext/fileinfo/libmagic/magic.c:1.1.2.4
--- php-src/ext/fileinfo/libmagic/magic.c:1.1.2.3 Mon Sep 1 18:56:06 2008
+++ php-src/ext/fileinfo/libmagic/magic.c Tue Sep 2 10:15:54 2008
@@ -275,7 +275,7 @@
unsigned char *buf;
struct stat sb;
ssize_t nbytes = 0; /* number of bytes read from a datafile */
- int ispipe = 0;
+ int no_in_stream = 0;
TSRMLS_FETCH();
if (!inname && !stream) {
@@ -303,31 +303,29 @@
goto done;
}
- errno = 0;
+ errno = 0;
- if (!stream && inname) {
+ if (!stream && inname) {
+ no_in_stream = 1;
#if (PHP_MAJOR_VERSION < 6)
stream = php_stream_open_wrapper(inname, "rb", REPORT_ERRORS|ENFORCE_SAFE_MODE, NULL);
#else
stream = php_stream_open_wrapper(inname, "rb", REPORT_ERRORS, NULL);
#endif
- }
+ }
- if (!stream) {
- fprintf(stderr, "couldn't open file\n");
- if (info_from_stat(ms, sb.st_mode) == -1)
- goto done;
- rv = 0;
- goto done;
- }
+ if (!stream) {
+ fprintf(stderr, "couldn't open file\n");
+ if (info_from_stat(ms, sb.st_mode) == -1)
+ goto done;
+ rv = 0;
+ goto done;
+ }
#ifdef O_NONBLOCK
-/* we should be already be in non blocking mode for network socket
- * leaving the comment/#ifdef as documentation
- */
+ /* we should be already be in non blocking mode for network socket */
#endif
-
/*
* try looking at the first HOWMANY bytes
*/
@@ -343,7 +341,7 @@
done:
efree(buf);
- if (stream) {
+ if (no_in_stream && stream) {
php_stream_close(stream);
}
@@ -351,7 +349,6 @@
return rv == 0 ? file_getbuffer(ms) : NULL;
}
-
public const char *
magic_buffer(struct magic_set *ms, const void *buf, size_t nb)
{
http://cvs.php.net/viewvc.cgi/php-src/ext/fileinfo/tests/finfo_file_001.phpt?r1=1.1.2.5&r2=1.1.2.6&diff_format=u
Index: php-src/ext/fileinfo/tests/finfo_file_001.phpt
diff -u php-src/ext/fileinfo/tests/finfo_file_001.phpt:1.1.2.5
php-src/ext/fileinfo/tests/finfo_file_001.phpt:1.1.2.6
--- php-src/ext/fileinfo/tests/finfo_file_001.phpt:1.1.2.5 Mon Sep 1 23:44:00 2008
+++ php-src/ext/fileinfo/tests/finfo_file_001.phpt Tue Sep 2 10:15:54 2008
@@ -22,5 +22,5 @@
bool(false)
string(9) "directory"
-Warning: finfo_file(&): failed to open stream: No such file or directory in %s on line %d
+Warning: finfo_file(): File or path not found '&' in %s on line %d
bool(false)