]> granicus.if.org Git - php/commitdiff
Binary safe multipart request handling
authorIlia Alshanetsky <iliaa@php.net>
Thu, 27 Jul 2006 17:04:15 +0000 (17:04 +0000)
committerIlia Alshanetsky <iliaa@php.net>
Thu, 27 Jul 2006 17:04:15 +0000 (17:04 +0000)
main/rfc1867.c

index aa2c2cdf69bb8140207bfbc46070233b5be45e4f..5961853f89786cc00ab1c19e5d470af74383c2d1 100644 (file)
@@ -40,7 +40,7 @@ PHPAPI int (*php_rfc1867_callback)(unsigned int event, void *event_data, void **
 #if HAVE_MBSTRING && !defined(COMPILE_DL_MBSTRING)
 #include "ext/mbstring/mbstring.h"
 
-static void safe_php_register_variable(char *var, char *strval, zval *track_vars_array, zend_bool override_protection TSRMLS_DC);
+static void safe_php_register_variable(char *var, char *strval, int val_len, zval *track_vars_array, zend_bool override_protection TSRMLS_DC);
 
 #define SAFE_RETURN { \
     php_mb_flush_gpc_variables(num_vars, val_list, len_list, array_ptr TSRMLS_CC); \
@@ -64,7 +64,7 @@ void php_mb_flush_gpc_variables(int num_vars, char **val_list, int *len_list, zv
                        php_mb_gpc_encoding_converter(val_list, len_list, num_vars, NULL, NULL TSRMLS_CC);
                }
                for (i=0; i<num_vars; i+=2){
-                       safe_php_register_variable(val_list[i], val_list[i+1], array_ptr, 0 TSRMLS_CC);
+                       safe_php_register_variable(val_list[i], val_list[i+1], len_list[i+1], array_ptr, 0 TSRMLS_CC);
                        efree(val_list[i]);
                        efree(val_list[i+1]);
                } 
@@ -223,10 +223,10 @@ static zend_bool is_protected_variable(char *varname TSRMLS_DC)
 }
 
 
-static void safe_php_register_variable(char *var, char *strval, zval *track_vars_array, zend_bool override_protection TSRMLS_DC)
+static void safe_php_register_variable(char *var, char *strval, int val_len, zval *track_vars_array, zend_bool override_protection TSRMLS_DC)
 {
        if (override_protection || !is_protected_variable(var TSRMLS_CC)) {
-               php_register_variable(var, strval, track_vars_array TSRMLS_CC);
+               php_register_variable_safe(var, strval, val_len, track_vars_array TSRMLS_CC);
        }
 }
 
@@ -244,7 +244,7 @@ static void register_http_post_files_variable(char *strvar, char *val, zval *htt
        int register_globals = PG(register_globals);
 
        PG(register_globals) = 0;
-       safe_php_register_variable(strvar, val, http_post_files, override_protection TSRMLS_CC);
+       safe_php_register_variable(strvar, val, strlen(val), http_post_files, override_protection TSRMLS_CC);
        PG(register_globals) = register_globals;
 }
 
@@ -757,7 +757,7 @@ static int multipart_buffer_read(multipart_buffer *self, char *buf, int bytes, i
   XXX: this is horrible memory-usage-wise, but we only expect
   to do this on small pieces of form data.
 */
-static char *multipart_buffer_read_body(multipart_buffer *self TSRMLS_DC)
+static char *multipart_buffer_read_body(multipart_buffer *self, unsigned int *len TSRMLS_DC)
 {
        char buf[FILLUNIT], *out=NULL;
        int total_bytes=0, read_bytes=0;
@@ -769,6 +769,7 @@ static char *multipart_buffer_read_body(multipart_buffer *self TSRMLS_DC)
        }
 
        if (out) out[total_bytes] = '\0';
+       *len = total_bytes;
 
        return out;
 }
@@ -915,15 +916,15 @@ SAPI_API SAPI_POST_HANDLER_FUNC(rfc1867_post_handler)
 
                        /* Normal form variable, safe to read all data into memory */
                        if (!filename && param) {
-
-                               char *value = multipart_buffer_read_body(mbuff TSRMLS_CC);
+                               unsigned int value_len;
+                               char *value = multipart_buffer_read_body(mbuff, &value_len TSRMLS_CC);
                                unsigned int new_val_len; /* Dummy variable */
 
                                if (!value) {
                                        value = estrdup("");
                                }
 
-                               if (sapi_module.input_filter(PARSE_POST, param, &value, strlen(value), &new_val_len TSRMLS_CC)) {
+                               if (sapi_module.input_filter(PARSE_POST, param, &value, value_len, &new_val_len TSRMLS_CC)) {
                                        if (php_rfc1867_callback != NULL) {
                                                multipart_event_formdata event_formdata;
                                                size_t newlength = 0;
@@ -940,16 +941,16 @@ SAPI_API SAPI_POST_HANDLER_FUNC(rfc1867_post_handler)
                                                }
                                                new_val_len = newlength;
                                        }
-                                       
+
 #if HAVE_MBSTRING && !defined(COMPILE_DL_MBSTRING)
                                        if (php_mb_encoding_translation(TSRMLS_C)) {
                                                php_mb_gpc_stack_variable(param, value, &val_list, &len_list, 
                                                                                                  &num_vars, &num_vars_max TSRMLS_CC);
                                        } else {
-                                               safe_php_register_variable(param, value, array_ptr, 0 TSRMLS_CC);
+                                               safe_php_register_variable(param, value, new_val_len, array_ptr, 0 TSRMLS_CC);
                                        }
 #else
-                                       safe_php_register_variable(param, value, array_ptr, 0 TSRMLS_CC);
+                                       safe_php_register_variable(param, value, new_val_len, array_ptr, 0 TSRMLS_CC);
 #endif
                                }
                                if (!strcasecmp(param, "MAX_FILE_SIZE")) {
@@ -1198,9 +1199,9 @@ filedone:
                        
                        if (!is_anonymous) {
                                if (s && s > filename) {
-                                       safe_php_register_variable(lbuf, s+1, NULL, 0 TSRMLS_CC);
+                                       safe_php_register_variable(lbuf, s+1, strlen(s+1), NULL, 0 TSRMLS_CC);
                                } else {
-                                       safe_php_register_variable(lbuf, filename, NULL, 0 TSRMLS_CC);
+                                       safe_php_register_variable(lbuf, filename, strlen(filename), NULL, 0 TSRMLS_CC);
                                }
                        }
 
@@ -1236,7 +1237,7 @@ filedone:
                                sprintf(lbuf, "%s_type", param);
                        }
                        if (!is_anonymous) {
-                               safe_php_register_variable(lbuf, cd, NULL, 0 TSRMLS_CC);
+                               safe_php_register_variable(lbuf, cd, strlen(cd), NULL, 0 TSRMLS_CC);
                        }
 
                        /* Add $foo[type] */
@@ -1260,7 +1261,7 @@ filedone:
                        PG(magic_quotes_gpc) = 0;
                        /* if param is of form xxx[.*] this will cut it to xxx */
                        if (!is_anonymous) {
-                               safe_php_register_variable(param, temp_filename, NULL, 1 TSRMLS_CC);
+                               safe_php_register_variable(param, temp_filename, strlen(temp_filename), NULL, 1 TSRMLS_CC);
                        }
        
                        /* Add $foo[tmp_name] */