From:             poleson at verio dot net
Operating system: FreeBSD 4.4
PHP version:      5CVS-2003-02-19 (dev)
PHP Bug Type:     cURL related
Bug description:  crash on failed connection when curl_getinfo() was called

This actually applicable to ALL revisions of php. It is 
valid for curl to return a NULL s_code value in some 
situations. When add_assoc_string_ex() attempts to create
the value in the array in this situation, a coredump is 
created. Better error checking is needed in this function.
The patch included provides better checking and fixes the
crash by not including content_type when it isnt a valid 
return type in these situation.

This patch is for CVS current though it is the same in 4.3.1
but in curl.c instead.

Patch included:
----------------------------------------------------------

--- interface.c.old Tue Feb 18 07:45:00 2003
+++ interface.c    Wed Feb 19 16:48:42 2003
@@ -1101,46 +1101,68 @@

                array_init(return_value);

-               curl_easy_getinfo(ch->cp, CURLINFO_EFFECTIVE_URL,
&s_code);
-               CAAS("url", s_code);
-               curl_easy_getinfo(ch->cp, CURLINFO_CONTENT_TYPE,
&s_code);
-               CAAS("content_type", s_code);
-               curl_easy_getinfo(ch->cp, CURLINFO_HTTP_CODE, &l_code);
-               CAAL("http_code", l_code);
-               curl_easy_getinfo(ch->cp, CURLINFO_HEADER_SIZE, &l_code);
-               CAAL("header_size", l_code);
-               curl_easy_getinfo(ch->cp, CURLINFO_REQUEST_SIZE,
&l_code);
-               CAAL("request_size", l_code);
-               curl_easy_getinfo(ch->cp, CURLINFO_FILETIME, &l_code);
-               CAAL("filetime", l_code);
-               curl_easy_getinfo(ch->cp, CURLINFO_SSL_VERIFYRESULT,
&l_code);
-               CAAL("ssl_verify_result", l_code);
-               curl_easy_getinfo(ch->cp, CURLINFO_REDIRECT_COUNT,
&l_code);
-               CAAL("redirect_count", l_code);
-               curl_easy_getinfo(ch->cp, CURLINFO_TOTAL_TIME, &d_code);
-               CAAD("total_time", d_code);
-               curl_easy_getinfo(ch->cp, CURLINFO_NAMELOOKUP_TIME,
&d_code);
-               CAAD("namelookup_time", d_code);
-               curl_easy_getinfo(ch->cp, CURLINFO_CONNECT_TIME,
&d_code);
-               CAAD("connect_time", d_code);
-               curl_easy_getinfo(ch->cp, CURLINFO_PRETRANSFER_TIME,
&d_code);
-               CAAD("pretransfer_time", d_code);
-               curl_easy_getinfo(ch->cp, CURLINFO_SIZE_UPLOAD, &d_code);
-               CAAD("size_upload", d_code);
-               curl_easy_getinfo(ch->cp, CURLINFO_SIZE_DOWNLOAD,
&d_code);
-               CAAD("size_download", d_code);
-               curl_easy_getinfo(ch->cp, CURLINFO_SPEED_DOWNLOAD,
&d_code);
-               CAAD("speed_download", d_code);
-               curl_easy_getinfo(ch->cp, CURLINFO_SPEED_UPLOAD,
&d_code);
-               CAAD("speed_upload", d_code);
-               curl_easy_getinfo(ch->cp,
CURLINFO_CONTENT_LENGTH_DOWNLOAD, &d_code);
-               CAAD("download_content_length", d_code);
-               curl_easy_getinfo(ch->cp, CURLINFO_CONTENT_LENGTH_UPLOAD,
&d_code);
-               CAAD("upload_content_length", d_code);
-               curl_easy_getinfo(ch->cp, CURLINFO_STARTTRANSFER_TIME,
&d_code);
-               CAAD("starttransfer_time", d_code);
-               curl_easy_getinfo(ch->cp, CURLINFO_REDIRECT_TIME,
&d_code);
-               CAAD("redirect_time", d_code);
+               if (curl_easy_getinfo(ch->cp, CURLINFO_EFFECTIVE_URL,
&s_code) == CURLE_OK) {
+                       CAAS("url", s_code);
+               }
+               if (curl_easy_getinfo(ch->cp, CURLINFO_CONTENT_TYPE,
&s_code) == CURLE_OK) {
+                       if ( s_code != NULL ) {
+                               CAAS("content_type", s_code);
+                       }
+               }
+               if (curl_easy_getinfo(ch->cp, CURLINFO_HTTP_CODE, &l_code)
== CURLE_OK) {
+                       CAAL("http_code", l_code);
+               }
+               if (curl_easy_getinfo(ch->cp, CURLINFO_HEADER_SIZE,
&l_code) == CURLE_OK) {
+                       CAAL("header_size", l_code);
+               }
+               if (curl_easy_getinfo(ch->cp, CURLINFO_REQUEST_SIZE,
&l_code) == CURLE_OK) {
+                       CAAL("request_size", l_code);
+               }
+               if (curl_easy_getinfo(ch->cp, CURLINFO_FILETIME, &l_code)
== CURLE_OK) {
+                       CAAL("filetime", l_code);
+               }
+               if (curl_easy_getinfo(ch->cp, CURLINFO_SSL_VERIFYRESULT,
&l_code) == CURLE_OK) {
+                       CAAL("ssl_verify_result", l_code);
+               }
+               if (curl_easy_getinfo(ch->cp, CURLINFO_REDIRECT_COUNT,
&l_code) == CURLE_OK) {
+                       CAAL("redirect_count", l_code);
+               }
+               if (curl_easy_getinfo(ch->cp, CURLINFO_TOTAL_TIME,
&d_code) == CURLE_OK) {
+                       CAAD("total_time", d_code);
+               }
+               if (curl_easy_getinfo(ch->cp, CURLINFO_NAMELOOKUP_TIME,
&d_code) == CURLE_OK) {
+                       CAAD("namelookup_time", d_code);
+               }
+               if (curl_easy_getinfo(ch->cp, CURLINFO_CONNECT_TIME,
&d_code) == CURLE_OK) {
+                       CAAD("connect_time", d_code);
+               }
+               if (curl_easy_getinfo(ch->cp, CURLINFO_PRETRANSFER_TIME,
&d_code) == CURLE_OK) {
+                       CAAD("pretransfer_time", d_code);
+               }
+               if (curl_easy_getinfo(ch->cp, CURLINFO_SIZE_UPLOAD,
&d_code) == CURLE_OK) {
+                       CAAD("size_upload", d_code);
+               }
+               if (curl_easy_getinfo(ch->cp, CURLINFO_SIZE_DOWNLOAD,
&d_code) == CURLE_OK) {
+                       CAAD("size_download", d_code);
+               }
+               if (curl_easy_getinfo(ch->cp, CURLINFO_SPEED_DOWNLOAD,
&d_code) == CURLE_OK) {
+                       CAAD("speed_download", d_code);
+               }
+               if (curl_easy_getinfo(ch->cp, CURLINFO_SPEED_UPLOAD,
&d_code) == CURLE_OK) {
+                       CAAD("speed_upload", d_code);
+               }
+               if (curl_easy_getinfo(ch->cp,
CURLINFO_CONTENT_LENGTH_DOWNLOAD, &d_code) == CURLE_OK) {
+                       CAAD("download_content_length", d_code);
+               }
+               if (curl_easy_getinfo(ch->cp,
CURLINFO_CONTENT_LENGTH_UPLOAD, &d_code) == CURLE_OK) {
+                       CAAD("upload_content_length", d_code);
+               }
+               if (curl_easy_getinfo(ch->cp, CURLINFO_STARTTRANSFER_TIME,
&d_code) == CURLE_OK) {
+                       CAAD("starttransfer_time", d_code);
+               }
+               if (curl_easy_getinfo(ch->cp, CURLINFO_REDIRECT_TIME,
&d_code) == CURLE_OK) {
+                       CAAD("redirect_time", d_code);
+               }
        } else {
                option = Z_LVAL_PP(zoption);
                switch (option) {
-- 
Edit bug report at http://bugs.php.net/?id=22312&edit=1
-- 
Try a CVS snapshot:         http://bugs.php.net/fix.php?id=22312&r=trysnapshot
Fixed in CVS:               http://bugs.php.net/fix.php?id=22312&r=fixedcvs
Fixed in release:           http://bugs.php.net/fix.php?id=22312&r=alreadyfixed
Need backtrace:             http://bugs.php.net/fix.php?id=22312&r=needtrace
Try newer version:          http://bugs.php.net/fix.php?id=22312&r=oldversion
Not developer issue:        http://bugs.php.net/fix.php?id=22312&r=support
Expected behavior:          http://bugs.php.net/fix.php?id=22312&r=notwrong
Not enough info:            http://bugs.php.net/fix.php?id=22312&r=notenoughinfo
Submitted twice:            http://bugs.php.net/fix.php?id=22312&r=submittedtwice
register_globals:           http://bugs.php.net/fix.php?id=22312&r=globals
PHP 3 support discontinued: http://bugs.php.net/fix.php?id=22312&r=php3
Daylight Savings:           http://bugs.php.net/fix.php?id=22312&r=dst
IIS Stability:              http://bugs.php.net/fix.php?id=22312&r=isapi
Install GNU Sed:            http://bugs.php.net/fix.php?id=22312&r=gnused

Reply via email to