jani            Wed Dec 17 14:13:25 2008 UTC

  Modified files:              
    /php-src/ext/curl   interface.c php_curl.h 
  Log:
  - Fixed bug #45161 (Reusing a curl handle leaks memory)
  
http://cvs.php.net/viewvc.cgi/php-src/ext/curl/interface.c?r1=1.138&r2=1.139&diff_format=u
Index: php-src/ext/curl/interface.c
diff -u php-src/ext/curl/interface.c:1.138 php-src/ext/curl/interface.c:1.139
--- php-src/ext/curl/interface.c:1.138  Tue Dec  9 17:17:49 2008
+++ php-src/ext/curl/interface.c        Wed Dec 17 14:13:25 2008
@@ -16,7 +16,7 @@
    +----------------------------------------------------------------------+
 */
 
-/* $Id: interface.c,v 1.138 2008/12/09 17:17:49 iliaa Exp $ */
+/* $Id: interface.c,v 1.139 2008/12/17 14:13:25 jani Exp $ */
 
 #define ZEND_INCLUDE_FULL_WINDOWS_HEADERS
 
@@ -323,7 +323,6 @@
        char str[1024];
        size_t n = 0;
 
-
        d = curl_version_info(CURLVERSION_NOW);
        php_info_print_table_start();
        php_info_print_table_row(2, "cURL support",    "enabled");
@@ -331,7 +330,6 @@
        sprintf(str, "%d", d->age);
        php_info_print_table_row(2, "Age", str);
 
-
 #ifdef CURL_VERSION_IPV6
        if (d->features & CURL_VERSION_IPV6) {
                n = sprintf(str, "%s", "IPv6-enabled, ");
@@ -1102,6 +1100,7 @@
 /* }}} */
 #endif
 
+#if LIBCURL_VERSION_NUM < 0x071101
 /* {{{ curl_free_string
  */
 static void curl_free_string(void **string)
@@ -1109,6 +1108,7 @@
        efree(*string);
 }      
 /* }}} */
+#endif
 
 /* {{{ curl_free_post
  */
@@ -1184,7 +1184,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);
 }
@@ -1196,17 +1198,17 @@
 {
        php_curl        *ch;
        CURL            *cp;
-       zstr            src = NULL_ZSTR;
-       int             src_len = 0;
-       zend_uchar      src_type = 0;
+       zstr            url = NULL_ZSTR;
+       int             url_len = 0;
+       zend_uchar      url_type = 0;
 
-       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|t", &src, 
&src_len, &src_type) == FAILURE) {
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|t", &url, 
&url_len, &url_type) == FAILURE) {
                RETURN_FALSE;
        }
 
-       if (src.v && src_type == IS_UNICODE) {
-               src.s = zend_unicode_to_ascii((UChar*)src.u, src_len TSRMLS_CC);
-               if (!src.s) {
+       if (url.v && url_type == IS_UNICODE) {
+               url.s = zend_unicode_to_ascii((UChar*)url.u, url_len TSRMLS_CC);
+               if (!url.s) {
                        php_error_docref(NULL TSRMLS_CC, E_WARNING, "Binary or 
ASCII-Unicode string expected, non-ASCII-Unicode string received"); 
                        RETURN_FALSE;
                }
@@ -1246,12 +1248,16 @@
        curl_easy_setopt(ch->cp, CURLOPT_NOSIGNAL, 1);
 #endif
 
-       if (src.v) {
+       if (url.v) {
+#if LIBCURL_VERSION_NUM >= 0x071100
+               curl_easy_setopt(ch->cp, CURLOPT_URL, url.s);
+#else
                char *urlcopy;
 
-               urlcopy = estrndup(src.s, src_len);
+               urlcopy = estrndup(url.s, url_len);
                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);
@@ -1318,9 +1324,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);
 
@@ -1443,7 +1451,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);
 
@@ -1451,9 +1461,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;
                }
@@ -1694,6 +1709,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);
@@ -1702,6 +1722,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: 
@@ -1723,20 +1744,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);
 
@@ -1751,7 +1767,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);
 
@@ -1760,11 +1778,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:
@@ -2127,7 +2148,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.49&r2=1.50&diff_format=u
Index: php-src/ext/curl/php_curl.h
diff -u php-src/ext/curl/php_curl.h:1.49 php-src/ext/curl/php_curl.h:1.50
--- php-src/ext/curl/php_curl.h:1.49    Mon Dec 31 07:12:08 2007
+++ php-src/ext/curl/php_curl.h Wed Dec 17 14:13:25 2008
@@ -17,7 +17,7 @@
    +----------------------------------------------------------------------+
 */
 
-/* $Id: php_curl.h,v 1.49 2007/12/31 07:12:08 sebastian Exp $ */
+/* $Id: php_curl.h,v 1.50 2008/12/17 14:13:25 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