Bug #77359 [NEW]: spl_autoload causes segfault
| From: | lauri dot kentta at gmail dot com | Date: | Thu, 27 Dec 2018 13:55:22 +0000 |
| Subject: | Bug #77359 [NEW]: spl_autoload causes segfault | ||
| Groups: | php.bugs | ||
| Request: | Send a blank email to php-bugs+get-218642@lists.php.net to get a copy of this message | ||
From: lauri dot kentta at gmail dot com
Operating system: Linux
PHP version: 7.3.0
Package: SPL related
Bug Type: Bug
Bug description:spl_autoload causes segfault
Description:
------------
The function spl_autoload converts class name to lower case and later
tries to free this string. However, if it's already in lower case, it's
not copied, but the reference count is incremented instead. Then
zend_string_free is called, but this function can only be used if the
reference count is 1 (or 0) and otherwise leads to use-after-free (or
failed assertion).
Looks like blame goes to commit 084c17fe0b68d391467fd48a14433443d4fcba81
(Dmitry Stogov <dmitry@zend.com>). Cases of zend_str_tolower_copy were
converted to zend_string_tolower to avoid reallocations, but at least in
this case, freeing was not fixed accordingly.
Test script:
---------------
<?php
$a = md5(""); # Create a non-interned string.
spl_autoload($a); # Invalid free.
spl_autoload($a); # Use after free.
echo "{$a} + foo\n"; # Use after free.
# Notice how "foo" is not printed even if the code does not crash.
# Run it a few times to get a crash.
?>
Expected result:
----------------
No crash, full output.
Actual result:
--------------
Crash or truncated output.
--
Edit bug report at https://bugs.php.net/bug.php?id=77359&edit=1
--
Try a snapshot (PHP 5.4): https://bugs.php.net/fix.php?id=77359&r=trysnapshot54
Try a snapshot (PHP 5.5): https://bugs.php.net/fix.php?id=77359&r=trysnapshot55
Try a snapshot (trunk): https://bugs.php.net/fix.php?id=77359&r=trysnapshottrunk
Fixed in SVN: https://bugs.php.net/fix.php?id=77359&r=fixed
Fixed in release: https://bugs.php.net/fix.php?id=77359&r=alreadyfixed
Need backtrace: https://bugs.php.net/fix.php?id=77359&r=needtrace
Need Reproduce Script: https://bugs.php.net/fix.php?id=77359&r=needscript
Try newer version: https://bugs.php.net/fix.php?id=77359&r=oldversion
Not developer issue: https://bugs.php.net/fix.php?id=77359&r=support
Expected behavior: https://bugs.php.net/fix.php?id=77359&r=notwrong
Not enough info: https://bugs.php.net/fix.php?id=77359&r=notenoughinfo
Submitted twice: https://bugs.php.net/fix.php?id=77359&r=submittedtwice
register_globals: https://bugs.php.net/fix.php?id=77359&r=globals
PHP 4 support discontinued: https://bugs.php.net/fix.php?id=77359&r=php4
Daylight Savings: https://bugs.php.net/fix.php?id=77359&r=dst
IIS Stability: https://bugs.php.net/fix.php?id=77359&r=isapi
Install GNU Sed: https://bugs.php.net/fix.php?id=77359&r=gnused
Floating point limitations: https://bugs.php.net/fix.php?id=77359&r=float
No Zend Extensions: https://bugs.php.net/fix.php?id=77359&r=nozend
MySQL Configuration Error: https://bugs.php.net/fix.php?id=77359&r=mysqlcfg