iliaa           Fri Jan 12 16:38:40 2007 UTC

  Modified files:              (Branch: PHP_4_4)
    /php-src    NEWS 
    /php-src/ext/curl   curl.c 
  Log:
  Fixed bug #36248 (CURLOPT_HEADERFUNCTION, couldn't set the function in the
  class).
  
  
http://cvs.php.net/viewvc.cgi/php-src/NEWS?r1=1.1247.2.920.2.183&r2=1.1247.2.920.2.184&diff_format=u
Index: php-src/NEWS
diff -u php-src/NEWS:1.1247.2.920.2.183 php-src/NEWS:1.1247.2.920.2.184
--- php-src/NEWS:1.1247.2.920.2.183     Tue Jan  9 17:06:42 2007
+++ php-src/NEWS        Fri Jan 12 16:38:39 2007
@@ -3,6 +3,8 @@
 ?? Jan 2007, Version 4.4.5
 - Fixed bug #39819 (Using $this not in object context can cause segfaults).
   (Dmitry)
+- Fixed bug #36248 (CURLOPT_HEADERFUNCTION, couldn't set the function in the
+  class). (Ilia)
 
 04 Jan 2007, Version 4.4.5RC1
 - Added a meta tag to phpinfo() output to prevent search engines from 
http://cvs.php.net/viewvc.cgi/php-src/ext/curl/curl.c?r1=1.124.2.30.2.15&r2=1.124.2.30.2.16&diff_format=u
Index: php-src/ext/curl/curl.c
diff -u php-src/ext/curl/curl.c:1.124.2.30.2.15 
php-src/ext/curl/curl.c:1.124.2.30.2.16
--- php-src/ext/curl/curl.c:1.124.2.30.2.15     Mon Jan  1 09:46:40 2007
+++ php-src/ext/curl/curl.c     Fri Jan 12 16:38:40 2007
@@ -16,7 +16,7 @@
    +----------------------------------------------------------------------+
 */
 
-/* $Id: curl.c,v 1.124.2.30.2.15 2007/01/01 09:46:40 sebastian Exp $ */
+/* $Id: curl.c,v 1.124.2.30.2.16 2007/01/12 16:38:40 iliaa Exp $ */
 
 #ifdef HAVE_CONFIG_H
 #include "config.h"
@@ -702,19 +702,17 @@
                                                                           
retval, 2, argv TSRMLS_CC);
                        ch->in_callback = 0;
                        if (error == FAILURE) {
-                               php_error(E_WARNING, "%s(): Couldn't call the 
CURLOPT_HEADERFUNCTION", 
-                                                 
get_active_function_name(TSRMLS_C));
+                               php_error_docref(NULL TSRMLS_CC, E_WARNING, 
"Could not call the CURLOPT_HEADERFUNCTION");
                                length = -1;
-                       }
-                       else {
+                       } else {
                                if (Z_TYPE_P(retval) != IS_LONG) {
                                        convert_to_long_ex(&retval);
                                }
                                length = Z_LVAL_P(retval);
+                               zval_ptr_dtor(&retval);
                        }
                        zval_ptr_dtor(&argv[0]);
                        zval_ptr_dtor(&argv[1]);
-                       zval_ptr_dtor(&retval);
                        break;
                }
 
@@ -1075,6 +1073,7 @@
                case CURLOPT_WRITEFUNCTION:
                        if (ch->handlers->write->func) {
                                zval_ptr_dtor(&ch->handlers->write->func);
+                               ch->handlers->write->func = NULL;
                        }
                        zval_add_ref(zvalue);
                        ch->handlers->write->func   = *zvalue;
@@ -1083,6 +1082,7 @@
                case CURLOPT_READFUNCTION:
                        if (ch->handlers->read->func) {
                                zval_ptr_dtor(&ch->handlers->read->func);
+                               ch->handlers->read->func = NULL;
                        }
                        zval_add_ref(zvalue);
                        ch->handlers->read->func   = *zvalue;
@@ -1091,6 +1091,7 @@
                case CURLOPT_HEADERFUNCTION:
                        if (ch->handlers->write_header->func) {
                                
zval_ptr_dtor(&ch->handlers->write_header->func);
+                               ch->handlers->write_header->func = NULL;
                        }
                        zval_add_ref(zvalue);
                        ch->handlers->write_header->func   = *zvalue;
@@ -1100,6 +1101,7 @@
                case CURLOPT_PASSWDFUNCTION:
                        if (ch->handlers->passwd) {
                                zval_ptr_dtor(&ch->handlers->passwd);
+                               ch->handlers->passwd = NULL;
                        }
                        zval_add_ref(zvalue);
                        ch->handlers->passwd = *zvalue;
@@ -1300,10 +1302,13 @@
        ch->uses++;
 
        if (ch->handlers->write->method == PHP_CURL_RETURN && 
ch->handlers->write->buf.len > 0) {
+               --ch->uses;
                if (ch->handlers->write->type != PHP_CURL_BINARY) 
                        smart_str_0(&ch->handlers->write->buf);
                RETURN_STRINGL(ch->handlers->write->buf.c, 
ch->handlers->write->buf.len, 0);
-       } else if (ch->handlers->write->method == PHP_CURL_RETURN) {
+       }
+       --ch->uses;
+       if (ch->handlers->write->method == PHP_CURL_RETURN) {
                RETURN_STRINGL("", sizeof("") - 1, 0);
        }
 
@@ -1506,7 +1511,11 @@
                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Attempt to close 
CURL handle from a callback");
                return;
        }
-       zend_list_delete(Z_LVAL_PP(zid));
+       if (ch->uses) { 
+               ch->uses--;
+       } else {
+               zend_list_delete(Z_LVAL_PP(zid));
+       }
 }
 /* }}} */
 
@@ -1521,14 +1530,22 @@
        zend_llist_clean(&ch->to_free.slist);
        zend_llist_clean(&ch->to_free.post);
 
-       if (ch->handlers->write->func) 
-               zval_ptr_dtor(&ch->handlers->write->func);
-       if (ch->handlers->read->func)  
+       if (ch->handlers->write->func) {
+               FREE_ZVAL(ch->handlers->write->func);
+               ch->handlers->read->func = NULL;
+       }
+       if (ch->handlers->read->func) {
                zval_ptr_dtor(&ch->handlers->read->func);
-       if (ch->handlers->write_header->func) 
-               zval_ptr_dtor(&ch->handlers->write_header->func);
-       if (ch->handlers->passwd) 
-               zval_ptr_dtor(&ch->handlers->passwd);
+               ch->handlers->read->func = NULL;
+       }
+       if (ch->handlers->write_header->func) {
+               FREE_ZVAL(ch->handlers->write_header->func);
+               ch->handlers->write_header->func = NULL;
+       }
+       if (ch->handlers->passwd) {
+               FREE_ZVAL(ch->handlers->passwd);
+               ch->handlers->passwd = NULL;
+       }
 
        efree(ch->handlers->write);
        efree(ch->handlers->write_header);

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

Reply via email to