]> granicus.if.org Git - php/commitdiff
Fix memory leak
authorPierrick Charron <pierrick@php.net>
Mon, 21 Nov 2011 02:29:24 +0000 (02:29 +0000)
committerPierrick Charron <pierrick@php.net>
Mon, 21 Nov 2011 02:29:24 +0000 (02:29 +0000)
ext/curl/interface.c

index 935f153acff65e02821a885d651e47ed033597b5..7d497381011f19bdabe39094dd631c138c4d041a 100644 (file)
@@ -1422,6 +1422,9 @@ static void alloc_curl_handle(php_curl **ch)
        (*ch)->header.str_len = 0;
 
        memset(&(*ch)->err, 0, sizeof((*ch)->err));
+       (*ch)->handlers->write->stream = NULL;
+       (*ch)->handlers->write_header->stream = NULL;
+       (*ch)->handlers->read->stream = NULL;
 
        zend_llist_init(&(*ch)->to_free.str,   sizeof(char *),            (llist_dtor_func_t) curl_free_string, 0);
        zend_llist_init(&(*ch)->to_free.slist, sizeof(struct curl_slist), (llist_dtor_func_t) curl_free_slist,  0);
@@ -1890,6 +1893,9 @@ string_copy:
                        switch (option) {
                                case CURLOPT_FILE:
                                        if (((php_stream *) what)->mode[0] != 'r' || ((php_stream *) what)->mode[1] == '+') {
+                                               if (ch->handlers->write->stream) {
+                                                       Z_DELREF_P(ch->handlers->write->stream);
+                                               }
                                                Z_ADDREF_PP(zvalue);
                                                ch->handlers->write->fp = fp;
                                                ch->handlers->write->method = PHP_CURL_FILE;
@@ -1902,6 +1908,9 @@ string_copy:
                                        break;
                                case CURLOPT_WRITEHEADER:
                                        if (((php_stream *) what)->mode[0] != 'r' || ((php_stream *) what)->mode[1] == '+') {
+                                               if (ch->handlers->write_header->stream) {
+                                                       Z_DELREF_P(ch->handlers->write_header->stream);
+                                               }
                                                Z_ADDREF_PP(zvalue);
                                                ch->handlers->write_header->fp = fp;
                                                ch->handlers->write_header->method = PHP_CURL_FILE;
@@ -1913,6 +1922,9 @@ string_copy:
                                        }
                                        break;
                                case CURLOPT_INFILE:
+                                       if (ch->handlers->read->stream) {
+                                               Z_DELREF_P(ch->handlers->read->stream);
+                                       }
                                        Z_ADDREF_PP(zvalue);
                                        ch->handlers->read->fp = fp;
                                        ch->handlers->read->fd = Z_LVAL_PP(zvalue);