From: nikic Operating system: PHP version: master-Git-2012-05-06 (Git) Package: Filesystem function related Bug Type: Bug Bug description:finfo_open with directory causes invalid free
Description: ------------ The simple script <?php finfo_open(FILEINFO_NONE, '.'); causes an invalid free to be reported by glibc, with the following gdb bt: #0 0x00130416 in __kernel_vsyscall () #1 0x009edc8f in __GI_raise (sig=6) at ../nptl/sysdeps/unix/sysv/linux/raise.c:64 #2 0x009f12b5 in __GI_abort () at abort.c:92 #3 0x00a2515c in __libc_message (do_abort=2, fmt=0xafe4c0 "*** glibc detected *** %s: %s: 0x%s ***\n") at ../sysdeps/unix/sysv/linux/libc_fatal.c:189 #4 0x00a2ff22 in malloc_printerr (action=<optimized out>, str=<optimized out>, ptr=0xbfff996c) at malloc.c:6283 #5 0x00a30168 in munmap_chunk (p=<optimized out>) at malloc.c:3540 #6 0x081ffde1 in apprentice_load (ms=0xb717d8f8, magicp=0xbfffa9bc, nmagicp=0xbfffa9c0, fn=0xb717d150 "/home/nikic/dev/Phuzzy/results", action=0) at /home/nikic/dev/php-src/ext/fileinfo/libmagic/apprentice.c:814 #7 0x081fecc9 in apprentice_1 (ms=0xb717d8f8, fn=0xb717d150 "/home/nikic/dev/Phuzzy/results", action=0, mlist=0xb717d1a0) at /home/nikic/dev/php-src/ext/fileinfo/libmagic/apprentice.c:275 #8 0x081fef8c in file_apprentice (ms=0xb717d8f8, fn=0xb717d150 "/home/nikic/dev/Phuzzy/results", action=0) at /home/nikic/dev/php-src/ext/fileinfo/libmagic/apprentice.c:369 #9 0x0820975e in magic_load (ms=0xb717d8f8, magicfile=0xbfffaaec "/home/nikic/dev/Phuzzy/results") at /home/nikic/dev/php-src/ext/fileinfo/libmagic/magic.c:308 #10 0x081fdc23 in zif_finfo_open (ht=2, return_value=0xb717c2cc, return_value_ptr=0x0, this_ptr=0x0, return_value_used=0, tsrm_ls=0x8c0f070) at /home/nikic/dev/php-src/ext/fileinfo/fileinfo.c:345 #11 0x085cf628 in zend_do_fcall_common_helper_SPEC (execute_data=0xb716007c, tsrm_ls=0x8c0f070) at /home/nikic/dev/php-src/Zend/zend_vm_execute.h:642 #12 0x085d6ddb in ZEND_DO_FCALL_SPEC_CONST_HANDLER (execute_data=0xb716007c, tsrm_ls=0x8c0f070) at /home/nikic/dev/php-src/Zend/zend_vm_execute.h:2219 #13 0x085cd8d5 in execute (op_array=0xb717cc14, tsrm_ls=0x8c0f070) at /home/nikic/dev/php-src/Zend/zend_vm_execute.h:410 #14 0x0859202e in zend_execute_scripts (type=8, tsrm_ls=0x8c0f070, retval=0x0, file_count=3) at /home/nikic/dev/php-src/Zend/zend.c:1272 #15 0x084f4e91 in php_execute_script (primary_file=0xbfffe110, tsrm_ls=0x8c0f070) at /home/nikic/dev/php-src/main/main.c:2473 #16 0x086dcbc9 in do_cli (argc=2, argv=0xbffff3b4, tsrm_ls=0x8c0f070) at /home/nikic/dev/php-src/sapi/cli/php_cli.c:988 #17 0x086de0ed in main (argc=2, argv=0xbffff3b4) at /home/nikic/dev/php-src/sapi/cli/php_cli.c:1361 The invalid free occurs in https://github.com/php/php-src/blob/master/ext/fileinfo/libmagic/apprentice.c#L814. The code for loading from a directory seems completely broken: The filenames are snprintf'd into the mfn variable, which is a char[MAXPATHLEN]. For every file that variable is then written into the array, without further copying: filearr[files++] = mfn; So basically at the end filearr just contains the last scanned path multiple times. In the second loop the individual filearr elements are then freed, which is wrong in two senses: a) it's always the same array element, so it would be a multi-free b) mfn is an array, it was never allocated, so it shouldn't be freed. The fix should be to copy mfn into a separate pointer when doing filearr[files++] = mfn; :) -- Edit bug report at https://bugs.php.net/bug.php?id=61964&edit=1 -- Try a snapshot (PHP 5.4): https://bugs.php.net/fix.php?id=61964&r=trysnapshot54 Try a snapshot (PHP 5.3): https://bugs.php.net/fix.php?id=61964&r=trysnapshot53 Try a snapshot (trunk): https://bugs.php.net/fix.php?id=61964&r=trysnapshottrunk Fixed in SVN: https://bugs.php.net/fix.php?id=61964&r=fixed Fixed in SVN and need be documented: https://bugs.php.net/fix.php?id=61964&r=needdocs Fixed in release: https://bugs.php.net/fix.php?id=61964&r=alreadyfixed Need backtrace: https://bugs.php.net/fix.php?id=61964&r=needtrace Need Reproduce Script: https://bugs.php.net/fix.php?id=61964&r=needscript Try newer version: https://bugs.php.net/fix.php?id=61964&r=oldversion Not developer issue: https://bugs.php.net/fix.php?id=61964&r=support Expected behavior: https://bugs.php.net/fix.php?id=61964&r=notwrong Not enough info: https://bugs.php.net/fix.php?id=61964&r=notenoughinfo Submitted twice: https://bugs.php.net/fix.php?id=61964&r=submittedtwice register_globals: https://bugs.php.net/fix.php?id=61964&r=globals PHP 4 support discontinued: https://bugs.php.net/fix.php?id=61964&r=php4 Daylight Savings: https://bugs.php.net/fix.php?id=61964&r=dst IIS Stability: https://bugs.php.net/fix.php?id=61964&r=isapi Install GNU Sed: https://bugs.php.net/fix.php?id=61964&r=gnused Floating point limitations: https://bugs.php.net/fix.php?id=61964&r=float No Zend Extensions: https://bugs.php.net/fix.php?id=61964&r=nozend MySQL Configuration Error: https://bugs.php.net/fix.php?id=61964&r=mysqlcfg