jani            Wed Dec 17 14:20:31 2008 UTC

  Modified files:              (Branch: PHP_5_2)
    /php-src    NEWS 
    /php-src/ext/curl   interface.c php_curl.h 
  Log:
  MFH:- Fixed bug #45161 (Reusing a curl handle leaks memory)
  
http://cvs.php.net/viewvc.cgi/php-src/NEWS?r1=1.2027.2.547.2.1361&r2=1.2027.2.547.2.1362&diff_format=u
Index: php-src/NEWS
diff -u php-src/NEWS:1.2027.2.547.2.1361 php-src/NEWS:1.2027.2.547.2.1362
--- php-src/NEWS:1.2027.2.547.2.1361    Sat Dec 13 13:37:58 2008
+++ php-src/NEWS        Wed Dec 17 14:20:30 2008
@@ -13,6 +13,7 @@
 - Fixed bug #46739 (array returned by curl_getinfo should contain content_type 
key). 
   (Mikko)
 - Fixed bug #46699 (xml_parse crash when parser is namespace aware). (Rob)
+- Fixed bug #45161 (Reusing a curl handle leaks memory). (Mark Karpeles, Jani)
 - Fixed bug #35975 (Session cookie expires date format isn't the most 
compatible.
   Now matches that of setcookie()). (Scott)
 
http://cvs.php.net/viewvc.cgi/php-src/ext/curl/interface.c?r1=1.62.2.14.2.38&r2=1.62.2.14.2.39&diff_format=u
Index: php-src/ext/curl/interface.c
diff -u php-src/ext/curl/interface.c:1.62.2.14.2.38 
php-src/ext/curl/interface.c:1.62.2.14.2.39
--- php-src/ext/curl/interface.c:1.62.2.14.2.38 Thu Dec  4 13:13:41 2008
+++ php-src/ext/curl/interface.c        Wed Dec 17 14:20:30 2008
@@ -16,7 +16,7 @@
    +----------------------------------------------------------------------+
 */
 
-/* $Id: interface.c,v 1.62.2.14.2.38 2008/12/04 13:13:41 mkoppanen Exp $ */
+/* $Id: interface.c,v 1.62.2.14.2.39 2008/12/17 14:20:30 jani Exp $ */
 
 #define ZEND_INCLUDE_FULL_WINDOWS_HEADERS
 
@@ -996,6 +996,7 @@
 /* }}} */
 #endif
 
+#if LIBCURL_VERSION_NUM < 0x071101
 /* {{{ curl_free_string
  */
 static void curl_free_string(void **string)
@@ -1003,6 +1004,7 @@
        efree(*string);
 }      
 /* }}} */
+#endif
 
 /* {{{ curl_free_post
  */
@@ -1077,7 +1079,9 @@
                
        memset(&(*ch)->err, 0, sizeof((*ch)->err));
        
+#if LIBCURL_VERSION_NUM < 0x071101
        zend_llist_init(&(*ch)->to_free.str,   sizeof(char *),            
(llist_dtor_func_t) curl_free_string, 0);
+#endif
        zend_llist_init(&(*ch)->to_free.slist, sizeof(struct curl_slist), 
(llist_dtor_func_t) curl_free_slist,  0);
        zend_llist_init(&(*ch)->to_free.post,  sizeof(struct HttpPost),   
(llist_dtor_func_t) curl_free_post,   0);
 }
@@ -1136,11 +1140,15 @@
 #endif
 
        if (argc > 0) {
+#if LIBCURL_VERSION_NUM >= 0x071100
+               curl_easy_setopt(ch->cp, CURLOPT_URL, Z_STRVAL_PP(url));
+#else
                char *urlcopy;
 
                urlcopy = estrndup(Z_STRVAL_PP(url), Z_STRLEN_PP(url));
                curl_easy_setopt(ch->cp, CURLOPT_URL, urlcopy);
                zend_llist_add_element(&ch->to_free.str, &urlcopy);
+#endif
        }
 
        ZEND_REGISTER_RESOURCE(return_value, ch, le_curl);
@@ -1206,9 +1214,11 @@
        curl_easy_setopt(dupch->cp, CURLOPT_INFILE,            (void *) dupch);
        curl_easy_setopt(dupch->cp, CURLOPT_WRITEHEADER,       (void *) dupch);
 
+#if LIBCURL_VERSION_NUM < 0x071101
        zend_llist_copy(&dupch->to_free.str, &ch->to_free.str);
        /* Don't try to free copied strings, they're free'd when the original 
handle is destroyed */
        dupch->to_free.str.dtor = NULL;
+#endif
        zend_llist_copy(&dupch->to_free.slist, &ch->to_free.slist);
        zend_llist_copy(&dupch->to_free.post, &ch->to_free.post);
 
@@ -1331,7 +1341,9 @@
                case CURLOPT_SSLENGINE_DEFAULT:
                case CURLOPT_SSLCERTTYPE:
                case CURLOPT_ENCODING: {
+#if LIBCURL_VERSION_NUM < 0x071100
                        char *copystr = NULL;
+#endif
        
                        convert_to_string_ex(zvalue);
 
@@ -1339,9 +1351,14 @@
                                
PHP_CURL_CHECK_OPEN_BASEDIR(Z_STRVAL_PP(zvalue), Z_STRLEN_PP(zvalue), 1);
                        }
 
+#if LIBCURL_VERSION_NUM >= 0x071100
+                       /* Strings passed to libcurl as ’char *’ arguments, 
are copied by the library... NOTE: before 7.17.0 strings were not copied. */
+                       error = curl_easy_setopt(ch->cp, option, 
Z_STRVAL_PP(zvalue));
+#else
                        copystr = estrndup(Z_STRVAL_PP(zvalue), 
Z_STRLEN_PP(zvalue));
                        error = curl_easy_setopt(ch->cp, option, copystr);
                        zend_llist_add_element(&ch->to_free.str, &copystr);
+#endif
 
                        break;
                }
@@ -1532,6 +1549,11 @@
                                error = curl_easy_setopt(ch->cp, 
CURLOPT_HTTPPOST, first);
 
                        } else {
+#if LIBCURL_VERSION_NUM >= 0x071101
+                               /* with curl 7.17.0 and later, we can use 
COPYPOSTFIELDS, but we have to provide size before */
+                               error = curl_easy_setopt(ch->cp, 
CURLOPT_POSTFIELDSIZE, Z_STRLEN_PP(zvalue));
+                               error = curl_easy_setopt(ch->cp, 
CURLOPT_COPYPOSTFIELDS, Z_STRVAL_PP(zvalue));
+#else
                                char *post = NULL;
 
                                convert_to_string_ex(zvalue);
@@ -1540,6 +1562,7 @@
 
                                error = curl_easy_setopt(ch->cp, 
CURLOPT_POSTFIELDS, post);
                                error = curl_easy_setopt(ch->cp, 
CURLOPT_POSTFIELDSIZE, Z_STRLEN_PP(zvalue));
+#endif
                        }
                        break;
                case CURLOPT_HTTPHEADER: 
@@ -1561,20 +1584,15 @@
                                 zend_hash_get_current_data(ph, (void **) 
&current) == SUCCESS;
                                 zend_hash_move_forward(ph)
                        ) {
-                               char *indiv = NULL;
-
                                SEPARATE_ZVAL(current);
                                convert_to_string_ex(current);
 
-                               indiv = estrndup(Z_STRVAL_PP(current), 
Z_STRLEN_PP(current) + 1);
-                               slist = curl_slist_append(slist, indiv);
+                               slist = curl_slist_append(slist, 
Z_STRVAL_PP(current));
                                if (!slist) {
-                                       efree(indiv);
                                        php_error_docref(NULL TSRMLS_CC, 
E_WARNING, "Could not build curl_slist"); 
                                        RETVAL_FALSE;
                                        return 1;
                                }
-                               zend_llist_add_element(&ch->to_free.str, 
&indiv);
                        }
                        zend_llist_add_element(&ch->to_free.slist, &slist);
 
@@ -1589,7 +1607,9 @@
                case CURLOPT_SSLCERT:
                case CURLOPT_RANDOM_FILE:
                case CURLOPT_COOKIEFILE: {
+#if LIBCURL_VERSION_NUM < 0x071100
                        char *copystr = NULL;
+#endif
 
                        convert_to_string_ex(zvalue);
 
@@ -1598,11 +1618,14 @@
                                return 1;
                        }
 
+#if LIBCURL_VERSION_NUM >= 0x071100
+                       error = curl_easy_setopt(ch->cp, option, 
Z_STRVAL_PP(zvalue));
+#else
                        copystr = estrndup(Z_STRVAL_PP(zvalue), 
Z_STRLEN_PP(zvalue));
 
                        error = curl_easy_setopt(ch->cp, option, copystr);
                        zend_llist_add_element(&ch->to_free.str, &copystr);
-
+#endif
                        break;
                }
                case CURLINFO_HEADER_OUT:
@@ -1968,7 +1991,9 @@
 #endif
        
        curl_easy_cleanup(ch->cp);
+#if LIBCURL_VERSION_NUM < 0x071101
        zend_llist_clean(&ch->to_free.str);
+#endif
        zend_llist_clean(&ch->to_free.slist);
        zend_llist_clean(&ch->to_free.post);
 
http://cvs.php.net/viewvc.cgi/php-src/ext/curl/php_curl.h?r1=1.44.2.2.2.3&r2=1.44.2.2.2.4&diff_format=u
Index: php-src/ext/curl/php_curl.h
diff -u php-src/ext/curl/php_curl.h:1.44.2.2.2.3 
php-src/ext/curl/php_curl.h:1.44.2.2.2.4
--- php-src/ext/curl/php_curl.h:1.44.2.2.2.3    Mon Dec 31 07:20:05 2007
+++ php-src/ext/curl/php_curl.h Wed Dec 17 14:20:30 2008
@@ -17,7 +17,7 @@
    +----------------------------------------------------------------------+
 */
 
-/* $Id: php_curl.h,v 1.44.2.2.2.3 2007/12/31 07:20:05 sebastian Exp $ */
+/* $Id: php_curl.h,v 1.44.2.2.2.4 2008/12/17 14:20:30 jani Exp $ */
 
 #ifndef _PHP_CURL_H
 #define _PHP_CURL_H
@@ -114,7 +114,9 @@
 };
 
 struct _php_curl_free {
+#if LIBCURL_VERSION_NUM < 0x071100
        zend_llist str;
+#endif
        zend_llist post;
        zend_llist slist;
 };



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

Reply via email to