iliaa           Fri Mar 12 12:31:10 2004 EDT

  Modified files:              
    /php-src/ext/curl   interface.c 
  Log:
  Additional checks of return values from user callback functions.
  
  
http://cvs.php.net/diff.php/php-src/ext/curl/interface.c?r1=1.38&r2=1.39&ty=u
Index: php-src/ext/curl/interface.c
diff -u php-src/ext/curl/interface.c:1.38 php-src/ext/curl/interface.c:1.39
--- php-src/ext/curl/interface.c:1.38   Fri Mar 12 11:36:30 2004
+++ php-src/ext/curl/interface.c        Fri Mar 12 12:31:10 2004
@@ -16,7 +16,7 @@
    +----------------------------------------------------------------------+
 */
 
-/* $Id: interface.c,v 1.38 2004/03/12 16:36:30 sterling Exp $ */
+/* $Id: interface.c,v 1.39 2004/03/12 17:31:10 iliaa Exp $ */
 
 #define ZEND_INCLUDE_FULL_WINDOWS_HEADERS
 
@@ -433,6 +433,9 @@
                                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Could not 
call the CURLOPT_WRITEFUNCTION");
                                length = -1;
                        } else {
+                               if (Z_TYPE_P(retval_ptr) != IS_LONG) {
+                                       convert_to_long_ex(&retval_ptr);
+                               }
                                length = Z_LVAL_P(retval_ptr);
                        }
 
@@ -500,8 +503,8 @@
                                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Cannot 
call the CURLOPT_READFUNCTION"); 
                        } else {
                                if (Z_TYPE_P(retval_ptr) == IS_STRING) {
-                                       memcpy(data, Z_STRVAL_P(retval_ptr), size * 
nmemb);
-                                       length = Z_STRLEN_P(retval_ptr);
+                                       length = MIN(size * nmemb, 
Z_STRLEN_P(retval_ptr));
+                                       memcpy(data, Z_STRVAL_P(retval_ptr), length);
                                }
                        }
 
@@ -571,6 +574,9 @@
                                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Could not 
call the CURLOPT_HEADERFUNCTION");
                                length = -1;
                        } else {
+                               if (Z_TYPE_P(retval_ptr) != IS_LONG) {
+                                       convert_to_long_ex(&retval_ptr);
+                               }
                                length = Z_LVAL_P(retval_ptr);
                        }
                        zval_ptr_dtor(argv[0]);
@@ -578,8 +584,12 @@
                        zval_ptr_dtor(&retval_ptr);
                        break;
                }
+
                case PHP_CURL_IGNORE:
                        return length;
+
+               default:
+                       return -1;
        }
 
        return length;
@@ -595,7 +605,7 @@
        zval        *argv[3];
        zval        *retval = NULL;
        int          error;
-       int          ret = 0;
+       int          ret = -1;
        TSRMLS_FETCH_FROM_CTX(ch->thread_ctx);
 
        MAKE_STD_ZVAL(argv[0]);
@@ -610,13 +620,15 @@
        error = call_user_function(EG(function_table), NULL, func, retval, 2, argv 
TSRMLS_CC);
        if (error == FAILURE) {
                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Could not call the 
CURLOPT_PASSWDFUNCTION");
-               ret = -1;
        } else {
-               if (Z_STRLEN_P(retval) > buflen) {
-                       php_error_docref(NULL TSRMLS_CC, E_WARNING, "Returned password 
is too long for libcurl to handle");
-                       ret = -1;
+               if (Z_TYPE_P(retval) != IS_STRING) {
+                       if (Z_STRLEN_P(retval) > buflen) {
+                               php_error_docref(NULL TSRMLS_CC, E_WARNING, "Returned 
password is too long for libcurl to handle");
+                       } else {
+                               strlcpy(buf, Z_STRVAL_P(retval), Z_STRLEN_P(retval));
+                       }
                } else {
-                       strlcpy(buf, Z_STRVAL_P(retval), buflen);
+                       php_error_docref(NULL TSRMLS_CC, E_WARNING, "User handler '%s' 
did not return a string.", Z_STRVAL_P(func));
                }
        }
        

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

Reply via email to