|
php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login |
[2011-08-24 04:37 UTC] xavier dot prudhomme at gmail dot com
Description: ------------ For a complete description of this bug, please see this topic: http://groups.google.com/group/mongodb- user/browse_thread/thread/be07a66d75368f76 Basically, I got a segmentation fault when running a piece of code using a foreach loop on a mongodb cursor, which I first believed to be a mongodb php driver issue. However, when running my php script with the gnu debugger, here is what I got: Program received signal SIGSEGV, Segmentation fault. _php_ibm_db2_conn (le=0x12aa920) at /home/xavier/temp/php- 5.3.7/ext/ ibm_db2/ibm_db2.c:645 645 if (conn_res->flag_transaction == 1) { (gdb) bt #0 _php_ibm_db2_conn (le=0x12aa920) at /home/xavier/temp/php-5.3.7/ ext/ibm_db2/ibm_db2.c:645 #1 0x00000000007cc1b5 in zend_hash_apply (ht=0xfa78b8, apply_func=0x576090 <_php_ibm_db2_conn>) at /home/xavier/temp/ php-5.3.7/Zend/zend_hash.c:674 #2 0x0000000000571e3e in zm_deactivate_ibm_db2 (type=<value optimized out>, module_number=<value optimized out>) at /home/xavier/temp/ php-5.3.7/ext/ibm_db2/ibm_db2.c:663 #3 0x00000000007c16ac in module_registry_cleanup (module= <value optimized out>) at /home/xavier/temp/php- 5.3.7/Zend/zend_API.c:2168 #4 0x00000000007cc084 in zend_hash_reverse_apply (ht=0xfa7ec0, apply_func=0x7c1690 <module_registry_cleanup>) at /home/xavier/temp/ php-5.3.7/Zend/zend_hash.c:757 #5 0x00000000007c00dd in zend_deactivate_modules () at /home/xavier/ temp/php-5.3.7/Zend/zend.c:867 #6 0x000000000076c945 in php_request_shutdown (dummy=<value optimized out>) at /home/xavier/temp/php-5.3.7/main/main.c:1614 #7 0x0000000000849478 in main (argc=<value optimized out>, argv=<value optimized out>) at /home/xavier/temp/php- 5.3.7/sapi/cli/ php_cli.c:1363 So it seems that the ibm_db2 driver is stomping on memory used by others php extensions. Kristina Chodorow helped me with this issue and wrote : "PHP keeps a list of persistent bits of memory that is shared by all extensions. The DB2 extension is going through the entire list and treating everything as a struct allocated by DB2. However, the Mongo extension uses that list, too! DB2 is trying to destroy all of Mongo's persistent structs at the end of each request. You could file a bug with the DB2 extension, I don't know how active development is. You might also be able to fix it yourself by adding: if (le->type != le_pconn_struct) { return ZEND_HASH_APPLY_KEEP; } right before the line that segfaulted ( if (conn_res- >flag_transaction == 1) { ), so you'd end up with: static int _php_ibm_db2_conn (zend_rsrc_list_entry *le TSRMLS_DC) { conn_handle *conn_res; int rc = 0; conn_res = (conn_handle *) le->ptr; if (le->type != le_pconn_struct) { return ZEND_HASH_APPLY_KEEP; } if (conn_res->flag_transaction == 1) { conn_res->flag_transaction = 0; if( conn_res->handle_active && conn_res- >flag_pconnect ) { in ibm_db2.c. This makes DB2 only destroy structs DB2 'owns'. " I did the modification in the ibm_db2.c file, and it did the trick, now it works fine. I guess this should be added in a next release of the ibm_db2 driver. About my configuration: I am using php 5.3.7 (but got exactly the same issue with 5.3.6), ibm_db2 php driver 1.9.1, mongodb php driver 1.2.4, os : ubuntu 10.04 LTS. Hope this could help. Reproduce code: --------------- Please see topic here : http://groups.google.com/group/mongodb-user/browse_thread/thread/be07a66d75368f76 Expected result: ---------------- Just a code that runs fine without any segmentation fault PatchesPull RequestsHistoryAllCommentsChangesGit/SVN commits
|
|||||||||||||||||||||||||||
Copyright © 2001-2025 The PHP GroupAll rights reserved. |
Last updated: Mon Oct 27 15:00:01 2025 UTC |
I have tested the lastest release (1.9.2) and still got the same segmentation fault: Program received signal SIGSEGV, Segmentation fault. _php_ibm_db2_conn (le=0x8a983c0) at /home/wizome/temp/php- 5.3.8/ext/ibm_db2/ibm_db2.c:660 660 if ( conn_res->handle_active ) { (gdb) bt #0 _php_ibm_db2_conn (le=0x8a983c0) at /home/wizome/temp/php-5.3.8/ext/ibm_db2/ibm_db2.c:660 #1 0x083c150f in zend_hash_apply (ht=0x88d492c, apply_func=0x81b1ab0 <_php_ibm_db2_conn>) at /home/wizome/temp/php-5.3.8/Zend/zend_hash.c:674 #2 0x081ac10a in zm_deactivate_ibm_db2 (type=1, module_number=18) at /home/wizome/temp/php- 5.3.8/ext/ibm_db2/ibm_db2.c:676 #3 0x083b75b0 in module_registry_cleanup (module=0x88f2a68) at /home/wizome/temp/php-5.3.8/Zend/zend_API.c:2168 #4 0x083c13f8 in zend_hash_reverse_apply (ht=0x88d4cc0, apply_func=0x83b7590 <module_registry_cleanup>) at /home/wizome/temp/php-5.3.8/Zend/zend_hash.c:757 #5 0x083b6119 in zend_deactivate_modules () at /home/wizome/temp/php-5.3.8/Zend/zend.c:867 #6 0x08363d15 in php_request_shutdown (dummy=0x0) at /home/wizome/temp/php-5.3.8/main/main.c:1614 #7 0x08436253 in main (argc=2, argv=0xbffff754) at /home/wizome/temp/php-5.3.8/sapi/cli/php_cli.c:1363 (gdb) By adding these lignes : if (le->type != le_pconn_struct) { return ZEND_HASH_APPLY_KEEP; } right before the line that segfaulted , it fixes the issue. Kind RegardsHi, We encountered the same problem while testing both mongo and ibm_db2. The problem is that ibm_db2 doesn't check the resource type before trying to free/handle with it. The following patch by Yoram Bar Haim <yoram.b@zend.com> seem to fix that: --- ibm_db2.c (revision 315696) +++ ibm_db2.c (working copy) @@ -656,6 +656,10 @@ conn_handle *conn_res; int rc = 0; + /* don't act onresource is we don't "own" it */ + if (le->type != le_pconn_struct) { + return ZEND_HASH_APPLY_KEEP; + } conn_res = (conn_handle *) le->ptr; if ( conn_res->handle_active ) { if ( conn_res->flag_transaction == 1 && conn_res->auto_commit == 0 ) { Good luck, Lior Kaplan Zend Technologies Inc.