소스 검색

Merge branch 'hotfix/242'

Close #242
Matthew Weier O'Phinney 12 년 전
부모
커밋
f35d038a58
1개의 변경된 파일33개의 추가작업 그리고 1개의 파일을 삭제
  1. 33 1
      library/Zend/Validate/File/MimeType.php

+ 33 - 1
library/Zend/Validate/File/MimeType.php

@@ -115,6 +115,13 @@ class Zend_Validate_File_MimeType extends Zend_Validate_Abstract
     protected $_headerCheck = false;
 
     /**
+     * Holds error information returned by finfo_open
+     *
+     * @var array
+     */
+    protected $_finfoError;
+
+    /**
      * Sets validator options
      *
      * Mimetype to accept
@@ -209,11 +216,17 @@ class Zend_Validate_File_MimeType extends Zend_Validate_Abstract
             throw new Zend_Validate_Exception('The given magicfile can not be read');
         } else {
             $const = defined('FILEINFO_MIME_TYPE') ? FILEINFO_MIME_TYPE : FILEINFO_MIME;
+            set_error_handler(array($this, '_errorHandler'), E_NOTICE | E_WARNING);
             $this->_finfo = finfo_open($const, $file);
+            restore_error_handler();
             if (empty($this->_finfo)) {
                 $this->_finfo = null;
                 require_once 'Zend/Validate/Exception.php';
-                throw new Zend_Validate_Exception('The given magicfile is not accepted by finfo');
+                throw new Zend_Validate_Exception(
+                    sprintf('The given magicfile ("%s") is not accepted by finfo', $file),
+                    null,
+                    $this->_finfoError
+                );
             } else {
                 $this->_magicfile = $file;
             }
@@ -423,11 +436,15 @@ class Zend_Validate_File_MimeType extends Zend_Validate_Abstract
             $const = defined('FILEINFO_MIME_TYPE') ? FILEINFO_MIME_TYPE : FILEINFO_MIME;
 
             if (!empty($mimefile) && empty($this->_finfo)) {
+                set_error_handler(array($this, '_errorHandler'), E_NOTICE | E_WARNING);
                 $this->_finfo = finfo_open($const, $mimefile);
+                restore_error_handler();
             }
 
             if (empty($this->_finfo)) {
+                set_error_handler(array($this, '_errorHandler'), E_NOTICE | E_WARNING);
                 $this->_finfo = finfo_open($const);
+                restore_error_handler();
             }
 
             if (!empty($this->_finfo)) {
@@ -442,4 +459,19 @@ class Zend_Validate_File_MimeType extends Zend_Validate_Abstract
 
         return $type;
     }
+
+    /**
+     * Saves the provided error information by finfo_open to this instance
+     *
+     * @param  integer $errno
+     * @param  string  $errstr
+     * @param  string  $errfile
+     * @param  integer $errline
+     * @param  array   $errcontext
+     * @return void
+     */
+    protected function _errorHandler($errno, $errstr, $errfile, $errline)
+    {
+        $this->_finfoError = new ErrorException($errstr, $errno, 0, $errfile, $errline);
+    }
 }