Red Hat Bugzilla – Bug 858653
fileinfo extension: use stat function from stream wrapper
Last modified: 2013-02-21 05:14:29 EST
Description of problem: PHP has broken Fileinfo that doesn't support wrappers even it has context parameter for them. Version-Release number of selected component (if applicable): PHP 5.3.0-5.3.5 How reproducible: Try to use Fileinfo to get info from some wrapper ex. http:// Steps to Reproduce: <?php $url="http://74.125.143.94/images/srpr/logo3w.png"; $finfo=new finfo(FILEINFO_MIME); $str_mime = $finfo->file($url); var_dump($str_mime); ?> Actual results: PHP Warning: finfo::file(): File or path not found 'http://74.125.143.94/images/srpr/logo3w.png' in - on line 4 bool(false) Expected results: string(9) "image/png" Additional info: The old PECL Fileinfo module works, so if one installs that into RHEL5 it works, but as RHEL6 has Fileinfo itself which is broken, there's no nice way to fix this (without just copying a working Fileinfo over the broken one, which is bad way). Luckily this problem can be avoided by coding differently, but the problem is all the existing systems which relies that it just works<tm>. But that patch to fix it, would be nice to get into RHEL6. Workaround: <?php $url="http://74.125.143.94/images/srpr/logo3w.png"; $finfo=new finfo(FILEINFO_MIME); $str_mime=$finfo->buffer(file_get_contents($url)); var_dump($str_mime); ?>
Forgot to mention about the workaround that of course it's very bad with big files as now the whole file is loaded to string before trying to figure out what it is. If one has big files, probably just reading max 1k of the file would be better and then giving that to buffer().
Hi, thanks for contacting us. finfo::file() takes a filename argument by string. Are some docs somewhere which say otherwise? http://www.php.net/manual/en/function.finfo-file.php
No, filename as a argument is a string. Filename can be URI as it's a string. You see similar documentation here: http://php.net/manual/en/function.file-get-contents.php And the workaround uses that, which is documented as is that finfo-file, there's string for filename and context for stream wrappers.
Ah, thanks, sorry, I missed the upstream bug reference. Fixed in http://svn.php.net/viewvc?view=revision&revision=308327
The linked upstream bug refers to "stream". Applying the upstream patch works for some stream wrappers (tested with zip, from upstream unit test). Despite this patch, your test script doesn't work (even with latest upstream PHP version 5.4.8RC1). It seems http streams are curently not supported (need stat and seek capabilities) Need more investigation.
Good point. So there are two problems here: 1) the fileinfo extension does not use the stat interface from the stream wrapper. 2) the http stream wrapper does not support the stat interface The upstream patch referenced above does fix (1), but not (2). So it would fix use of e.g. zip:// URLs. We can pull in that fix. Jani, if you also require a fix for (2) can you file a new bug? Supporting http stat is an enhancement request, we'd have to get a fix accepted upstream for that.
In fact my comment about the zip:// URLs was not correct for php 5.3.3; even the zip stream wrapper does not support the stat interface in that version of PHP. To ensure we are 100% clear about the scope of the fix for this bug, we are intending to fix here only part (1) mentioned in comment 7. If stream wrapper support is required for other stream types, please file new enhancements bugs so we can track those requests separately.
Since the problem described in this bug report should be resolved in a recent advisory, it has been closed with a resolution of ERRATA. For information on the advisory, and where to find the updated files, follow the link below. If the solution does not work for you, open a new bug report. http://rhn.redhat.com/errata/RHSA-2013-0514.html