]> granicus.if.org Git - php/commitdiff
Fix bug #48493 - spl_autoload_register can leave the HT in an inconsistent way.
authorScott MacVicar <scottmac@php.net>
Tue, 9 Jun 2009 01:57:57 +0000 (01:57 +0000)
committerScott MacVicar <scottmac@php.net>
Tue, 9 Jun 2009 01:57:57 +0000 (01:57 +0000)
Need to point the second elements previous item to head so we can traverse upwards.

ext/spl/php_spl.c
ext/spl/tests/bug48493.phpt [new file with mode: 0644]

index 2ffb4d89bb8731f1e95c81dcdbe24433d35d51ec..a9f954aa6ebd37587cae2307e0ee4ce90bea4a6e 100755 (executable)
@@ -409,6 +409,7 @@ PHP_FUNCTION(spl_autoload_call)
        (ht)->pListTail->pListNext = (ht)->pListHead;                   \
        (ht)->pListHead = (ht)->pListTail;                                              \
        (ht)->pListTail = (ht)->pListHead->pListLast;                   \
+       (ht)->pListHead->pListNext->pListLast = (ht)->pListHead;\
        (ht)->pListTail->pListNext = NULL;                                              \
        (ht)->pListHead->pListLast = NULL;
 
diff --git a/ext/spl/tests/bug48493.phpt b/ext/spl/tests/bug48493.phpt
new file mode 100644 (file)
index 0000000..eee9259
--- /dev/null
@@ -0,0 +1,26 @@
+--TEST--
+SPL: Bug #48493 spl_autoload_unregister() can't handle prepended functions
+--FILE--
+<?php
+function autoload1() {}
+
+function autoload2() {}
+
+spl_autoload_register('autoload2');
+spl_autoload_register('autoload1', true, true);
+var_dump(spl_autoload_functions());
+
+spl_autoload_unregister('autoload2');
+var_dump(spl_autoload_functions());
+?>
+--EXPECT--
+array(2) {
+  [0]=>
+  unicode(9) "autoload1"
+  [1]=>
+  unicode(9) "autoload2"
+}
+array(1) {
+  [0]=>
+  unicode(9) "autoload1"
+}