thekid          Sat Nov  8 14:15:09 2008 UTC

  Modified files:              (Branch: PHP_5_2)
    /php-src/ext/sybase_ct      php_sybase_ct.c 
  Log:
  - MFB: Fixed problems with segmentation faults when using unbuffered queries
  # Double-freeing results caused these
  
http://cvs.php.net/viewvc.cgi/php-src/ext/sybase_ct/php_sybase_ct.c?r1=1.103.2.5.2.15&r2=1.103.2.5.2.16&diff_format=u
Index: php-src/ext/sybase_ct/php_sybase_ct.c
diff -u php-src/ext/sybase_ct/php_sybase_ct.c:1.103.2.5.2.15 
php-src/ext/sybase_ct/php_sybase_ct.c:1.103.2.5.2.16
--- php-src/ext/sybase_ct/php_sybase_ct.c:1.103.2.5.2.15        Sat Nov  8 
12:06:08 2008
+++ php-src/ext/sybase_ct/php_sybase_ct.c       Sat Nov  8 14:15:08 2008
@@ -18,7 +18,7 @@
    +----------------------------------------------------------------------+
  */
 
-/* $Id: php_sybase_ct.c,v 1.103.2.5.2.15 2008/11/08 12:06:08 thekid Exp $ */
+/* $Id: php_sybase_ct.c,v 1.103.2.5.2.16 2008/11/08 14:15:08 thekid Exp $ */
 
 
 #ifdef HAVE_CONFIG_H
@@ -138,6 +138,21 @@
 #define efree_n(x)  { efree(x); x = NULL; }
 #define efree_if(x) if (x) efree_n(x)
 
+#ifdef PHP_SYBASE_DEBUG
+#define FREE_SYBASE_RESULT(result)                                             
               \
+       if (result) {                                                           
                  \
+           fprintf(stderr, "_free_sybase_result(%p) called from line #%d\n", 
result, __LINE__);  \
+               fflush(stderr);                                                 
                      \
+               _free_sybase_result(result);                                    
                      \
+               result = NULL;                                                  
                      \
+       }
+#else
+#define FREE_SYBASE_RESULT(result)                                             
               \
+       if (result) {                                                           
                  \
+               _free_sybase_result(result);                                    
                      \
+               result = NULL;                                                  
                      \
+       }
+#endif
 static void _free_sybase_result(sybase_result *result)
 {
        int i, j;
@@ -191,7 +206,7 @@
                php_sybase_finish_results(result TSRMLS_CC);
        }
 
-       _free_sybase_result(result);
+       FREE_SYBASE_RESULT(result);
 }
 
 static void _close_sybase_link(zend_rsrc_list_entry *rsrc TSRMLS_DC)
@@ -1109,8 +1124,6 @@
                        
                case CS_CANCELED:
                default:
-                       _free_sybase_result(result);
-                       result = NULL;
                        retcode = CS_FAIL;
                        break;
        }
@@ -1216,7 +1229,7 @@
                        break;
                        
                default:
-                       _free_sybase_result(result);
+                       FREE_SYBASE_RESULT(result);
                        result = NULL;
                        retcode = CS_FAIL;              /* Just to be sure */
                        break;
@@ -1425,17 +1438,9 @@
                INIT_PZVAL(tmp);
                ZEND_FETCH_RESOURCE(result, sybase_result *, &tmp, -1, "Sybase 
result", le_result);
                
-               /* Causes the following segfault:
-                  Program received signal SIGSEGV, Segmentation fault.
-                  0x8144380 in _efree (ptr=0x81fe024, 
__zend_filename=0x81841a0 "php4/ext/sybase_ct/php_sybase_ct.c", 
-                  __zend_lineno=946, __zend_orig_filename=0x0, 
__zend_orig_lineno=0) at php4/Zend/zend_alloc.c:229
-                  php4/Zend/zend_alloc.c:229:7284:beg:0x8144380
-               */
-               #if O_TIMM
                if (result) {
                        php_sybase_finish_results(result TSRMLS_CC);
                }
-               #endif
                
                zval_ptr_dtor(&tmp);
                zend_list_delete(sybase_ptr->active_result_index);
@@ -1590,9 +1595,7 @@
                /* Retry deadlocks up until deadlock_retry_count times */       
        
                if (sybase_ptr->deadlock && SybCtG(deadlock_retry_count) != -1 
&& ++deadlock_count > SybCtG(deadlock_retry_count)) {
                        php_error_docref(NULL TSRMLS_CC, E_WARNING, "Sybase:  
Retried deadlock %d times [max: %ld], giving up", deadlock_count- 1, 
SybCtG(deadlock_retry_count));
-                       if (result != NULL) {
-                               _free_sybase_result(result);
-                       }
+                       FREE_SYBASE_RESULT(result);
                        break;
                }
 
@@ -1611,9 +1614,7 @@
                 * optimization, we could try not to fetch results in known
                 * deadlock conditions, but deadlock is (should be) rare.
                 */
-               if (result != NULL) {
-                       _free_sybase_result(result);
-               }
+               FREE_SYBASE_RESULT(result);
        }
 
        if (status == Q_SUCCESS) {
@@ -1621,9 +1622,7 @@
        }
 
        if (status == Q_FAILURE) {
-               if (result != NULL) {
-                       _free_sybase_result(result);
-               }
+               FREE_SYBASE_RESULT(result);
                RETURN_FALSE;
        }
 



-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to