Edit report at https://bugs.php.net/bug.php?id=64722&edit=1

 ID:                 64722
 Updated by:         johan...@php.net
 Reported by:        tj dot botha at plista dot com
 Summary:            PDO extension causes zend_mm_heap corrupted
 Status:             Feedback
 Type:               Bug
 Package:            PDO related
 Operating System:   Ubuntu Server 12.10
 PHP Version:        master-Git-2013-04-26 (Git)
 Block user comment: N
 Private report:     N

 New Comment:

so, the new backtrace has tsrm symbols, so what environment are you 
using?8which web server,sapi, ...) Why threaded context?

And please try using helgrind (valgrind --tool=helgrind) with the server, this 
should show details on race conditions.


Previous Comments:
------------------------------------------------------------------------
[2013-04-30 15:07:35] tj dot botha at plista dot com

Also - some additional info which may help:

(gdb) frame 3
#3  0x00007fffeb3e0056 in pdo_dbh_free_storage (dbh=0x7fffd00f56c0, 
tsrm_ls=0x7fffd0017170) at /home/tj/php-5.4.14/ext/pdo/pdo_dbh.c:1577
1577            zend_object_std_dtor(&dbh->std TSRMLS_CC);
(gdb) print dbh->std
$1 = {ce = 0x7fffd6d3afc0, properties = 0x0, properties_table = 0x7fffd6d39378, 
guards = 0x0}
(gdb)

and

for source_code/Zend/zend_objects.c:37 to 59:

ZEND_API void zend_object_std_dtor(zend_object *object TSRMLS_DC)
{
        if (object->guards) {
                zend_hash_destroy(object->guards);
                FREE_HASHTABLE(object->guards);
        }
        if (object->properties) {
                zend_hash_destroy(object->properties);
                FREE_HASHTABLE(object->properties);
                if (object->properties_table) {
                        efree(object->properties_table);
                }
        } else if (object->properties_table) {
                int i;

                for (i = 0; i < object->ce->default_properties_count; i++) {
                        if (object->properties_table[i]) {
                                zval_ptr_dtor(&object->properties_table[i]);
                        }
                }
                efree(object->properties_table);
        }
}


(gdb) print object->properties_table[0]
$2 = (zval *) 0x5a5a5a5a5a5a5a5a
(gdb) print &object->properties_table[0]
$3 = (zval **) 0x7fffd6d39378
(gdb) print object->ce->default_properties_count
$4 = 2
(gdb) print i
$5 = 0
(gdb)

Not sure if this loop is thread safe:

                for (i = 0; i < object->ce->default_properties_count; i++) {
                        if (object->properties_table[i]) {
                                zval_ptr_dtor(&object->properties_table[i]);
                        }
                }

Thanks for your help!

------------------------------------------------------------------------
[2013-04-30 15:01:07] tj dot botha at plista dot com

That is an old backtrace - here is the newest:

Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0x7fffd8fe9700 (LWP 31920)]
0x00007fffeb6a5722 in zval_delref_p (pz=0x5a5a5a5a5a5a5a5a) at /home/tj/php-
5.4.14/Zend/zend.h:395
395             return --pz->refcount__gc;
(gdb) backtrace 
#0  0x00007fffeb6a5722 in zval_delref_p (pz=0x5a5a5a5a5a5a5a5a) at /home/tj/php-
5.4.14/Zend/zend.h:395
#1  0x00007fffeb6a7d06 in _zval_ptr_dtor (zval_ptr=0x7fffd6d39378, 
__zend_filename=0x7fffebb88468 "/home/tj/php-5.4.14/Zend/zend_objects.c", 
__zend_lineno=54)
    at /home/tj/php-5.4.14/Zend/zend_execute_API.c:432
#2  0x00007fffeb6f258a in zend_object_std_dtor (object=0x7fffd00f56c0, 
tsrm_ls=0x7fffd0017170) at /home/tj/php-5.4.14/Zend/zend_objects.c:54
#3  0x00007fffeb3e0056 in pdo_dbh_free_storage (dbh=0x7fffd00f56c0, 
tsrm_ls=0x7fffd0017170) at /home/tj/php-5.4.14/ext/pdo/pdo_dbh.c:1577
#4  0x00007fffeb6fac18 in zend_objects_store_del_ref_by_handle_ex (handle=122, 
handlers=0x7fffebeb8a20 <pdo_dbh_object_handlers>, tsrm_ls=0x7fffd0017170)
    at /home/tj/php-5.4.14/Zend/zend_objects_API.c:221
#5  0x00007fffeb6fa759 in zend_objects_store_del_ref (zobject=0x7fffd6d240e0, 
tsrm_ls=0x7fffd0017170) at /home/tj/php-5.4.14/Zend/zend_objects_API.c:173
#6  0x00007fffeb6baacd in _zval_dtor_func (zvalue=0x7fffd6d240e0, 
__zend_filename=0x7fffebb83be8 "/home/tj/php-5.4.14/Zend/zend_execute_API.c", 
__zend_lineno=438)
    at /home/tj/php-5.4.14/Zend/zend_variables.c:54
#7  0x00007fffeb6a58c1 in _zval_dtor (zvalue=0x7fffd6d240e0, 
__zend_filename=0x7fffebb83be8 "/home/tj/php-5.4.14/Zend/zend_execute_API.c", 
__zend_lineno=438)
    at /home/tj/php-5.4.14/Zend/zend_variables.h:35
#8  0x00007fffeb6a7da9 in _zval_ptr_dtor (zval_ptr=0x7fffd6bee268, 
__zend_filename=0x7fffebb84cb0 "/home/tj/php-5.4.14/Zend/zend_variables.c", 
__zend_lineno=182)
    at /home/tj/php-5.4.14/Zend/zend_execute_API.c:438
#9  0x00007fffeb6baef5 in _zval_ptr_dtor_wrapper (zval_ptr=0x7fffd6bee268) at 
/home/tj/php-5.4.14/Zend/zend_variables.c:182
#10 0x00007fffeb6d3281 in zend_hash_destroy (ht=0x7fffd6d39768) at /home/tj/php-
5.4.14/Zend/zend_hash.c:560
#11 0x00007fffeb6baa76 in _zval_dtor_func (zvalue=0x7fffd7d18be8, 
__zend_filename=0x7fffebb83be8 "/home/tj/php-5.4.14/Zend/zend_execute_API.c", 
__zend_lineno=438)
    at /home/tj/php-5.4.14/Zend/zend_variables.c:45
#12 0x00007fffeb6a58c1 in _zval_dtor (zvalue=0x7fffd7d18be8, 
__zend_filename=0x7fffebb83be8 "/home/tj/php-5.4.14/Zend/zend_execute_API.c", 
__zend_lineno=438)
    at /home/tj/php-5.4.14/Zend/zend_variables.h:35
#13 0x00007fffeb6a7da9 in _zval_ptr_dtor (zval_ptr=0x7fffd7d18d98, 
__zend_filename=0x7fffebb84228 "/home/tj/php-5.4.14/Zend/zend_opcode.c", 
__zend_lineno=165)
    at /home/tj/php-5.4.14/Zend/zend_execute_API.c:438
#14 0x00007fffeb6aef6a in cleanup_user_class_data (ce=0x7fffd7d185d0, 
tsrm_ls=0x7fffd0017170) at /home/tj/php-5.4.14/Zend/zend_opcode.c:165
#15 0x00007fffeb6af1c8 in zend_cleanup_user_class_data (pce=0x7fffd00d6ad8, 
tsrm_ls=0x7fffd0017170) at /home/tj/php-5.4.14/Zend/zend_opcode.c:198
#16 0x00007fffeb6d3ce3 in zend_hash_reverse_apply (ht=0x7fffd001a770, 
apply_func=0x7fffeb6af194 <zend_cleanup_user_class_data>, 
tsrm_ls=0x7fffd0017170)
    at /home/tj/php-5.4.14/Zend/zend_hash.c:799
#17 0x00007fffeb6a71e8 in shutdown_executor (tsrm_ls=0x7fffd0017170) at 
/home/tj/php-5.4.14/Zend/zend_execute_API.c:289
#18 0x00007fffeb6be217 in zend_deactivate (tsrm_ls=0x7fffd0017170) at 
/home/tj/php-5.4.14/Zend/zend.c:938
#19 0x00007fffeb601c90 in php_request_shutdown (dummy=0x0) at /home/tj/php-
5.4.14/main/main.c:1800
#20 0x00007fffeb777c6d in php_apache_request_dtor (r=0x7fffd000f068, 
tsrm_ls=0x7fffd0017170) at /home/tj/php-
5.4.14/sapi/apache2handler/sapi_apache2.c:507
#21 0x00007fffeb7787cf in php_handler (r=0x7fffd000f068) at /home/tj/php-
5.4.14/sapi/apache2handler/sapi_apache2.c:679
#22 0x0000000000447e40 in ap_run_handler (r=0x7fffd000f068) at config.c:169
#23 0x000000000044827b in ap_invoke_handler (r=r@entry=0x7fffd000f068) at 
config.c:432
#24 0x000000000045b1bc in ap_internal_redirect (new_uri=<optimised out>, r=
<optimised out>) at http_request.c:644
#25 0x00007fffebed6658 in handler_redirect (r=0x7fffd0002970) at 
mod_rewrite.c:5051
#26 0x0000000000447e40 in ap_run_handler (r=0x7fffd0002970) at config.c:169
#27 0x000000000044827b in ap_invoke_handler (r=r@entry=0x7fffd0002970) at 
config.c:432
#28 0x000000000045bc5a in ap_process_async_request (r=0x7fffd0002970) at 
http_request.c:317
#29 0x0000000000458b27 in ap_process_http_async_connection (c=0x7fffe4037410) 
at 
http_core.c:143
#30 ap_process_http_connection (c=0x7fffe4037410) at http_core.c:228
#31 0x0000000000450ff0 in ap_run_process_connection (c=0x7fffe4037410) at 
connection.c:41
#32 0x000000000046284a in process_socket (my_thread_num=24, my_child_num=0, 
cs=0x7fffe4037398, sock=0x7fffe4037190, p=0x7fffe4037118, thd=0x6bf770) at 
event.c:964
#33 worker_thread (thd=0x6bf770, dummy=<optimised out>) at event.c:1812
#34 0x00007ffff7531e9a in start_thread () from /lib/x86_64-linux-
gnu/libpthread.so.0
#35 0x00007ffff725ecbd in clone () from /lib/x86_64-linux-gnu/libc.so.6
#36 0x0000000000000000 in ?? ()

The project relies heavily on PDO and runs okay on PHP 5.3.24.

------------------------------------------------------------------------
[2013-04-30 14:50:35] johan...@php.net

I can't reproduce this on my machine.

Apparently your PHP is not compiled in threaded mode (no tsrm_ls parameters in 
the stacktrace) so I assume you're not in threaded mode, so no race conditions.

Can you share more details on your setup and code?

------------------------------------------------------------------------
[2013-04-30 14:44:16] tj dot botha at plista dot com

I just want to emphasize - that commenting out the code not a solution - since 
it 
causes errors later down the line.  Also, when stepping / breaking at problem 
area through the code - the project starts loading in bits and pieces, no 
segfaults occur.  Only when left to run without breakpoints does it crash - 
therefor this really does seem like a concurrency problem.

------------------------------------------------------------------------
[2013-04-30 12:45:41] tj dot botha at plista dot com

This appears to be a race condition - so I am unable to reproduce.  I am 
however 
able to make the problem go away by modifying pdo_dbh.c to the following:

static void pdo_dbh_free_storage(pdo_dbh_t *dbh TSRMLS_DC)
{
        if (dbh->in_txn && dbh->methods && dbh->methods->rollback) {
                dbh->methods->rollback(dbh TSRMLS_CC);
                dbh->in_txn = 0;
        }
        
        if (dbh->is_persistent && dbh->methods && dbh->methods-
>persistent_shutdown) {
                dbh->methods->persistent_shutdown(dbh TSRMLS_CC);
        }
        //uncomment below to cause zend_mm_heap corrupted
        //zend_object_std_dtor(&dbh->std TSRMLS_CC);
        //dbh->std.properties = NULL;
        dbh_free(dbh TSRMLS_CC);
}

If I recompile this into PHP it works - however now there is most likely a 
memory leak.  I checked and this code is also new from PHP 5.3.  So definitely 
it is causing the fault.

Don't know what the real solution is though.

TJ

------------------------------------------------------------------------


The remainder of the comments for this report are too long. To view
the rest of the comments, please view the bug report online at

    https://bugs.php.net/bug.php?id=64722


-- 
Edit this bug report at https://bugs.php.net/bug.php?id=64722&edit=1

Reply via email to