Skip to content

Commit 0731f54

Browse files
committed
Fix #7987: POST/GET: string with \0(%00) values not parsed correctly
1 parent 868c876 commit 0731f54

File tree

2 files changed

+17
-8
lines changed

2 files changed

+17
-8
lines changed

main/php_variables.c

+15-8
Original file line numberDiff line numberDiff line change
@@ -29,12 +29,17 @@
2929
#include "zend_globals.h"
3030

3131

32-
PHPAPI void php_register_variable(char *var, char *strval, zval *track_vars_array ELS_DC PLS_DC)
32+
PHPAPI void php_register_variable(char *var, char *strval, zval *track_vars_array ELS_DC PLS_DC) {
33+
php_register_variable_safe(var, strval, strlen(strval), track_vars_array ELS_CC PLS_CC);
34+
}
35+
36+
/* binary-safe version */
37+
PHPAPI void php_register_variable_safe(char *var, char *strval, int str_len, zval *track_vars_array ELS_DC PLS_DC)
3338
{
3439
zval new_entry;
3540

3641
/* Prepare value */
37-
new_entry.value.str.len = strlen(strval);
42+
new_entry.value.str.len = str_len;
3843
if (PG(magic_quotes_gpc)) {
3944
new_entry.value.str.val = php_addslashes(strval, new_entry.value.str.len, &new_entry.value.str.len, 0);
4045
} else {
@@ -198,11 +203,12 @@ SAPI_POST_HANDLER_FUNC(php_std_post_handler)
198203
while (var) {
199204
val = strchr(var, '=');
200205
if (val) { /* have a value */
206+
int val_len;
207+
201208
*val++ = '\0';
202-
/* FIXME: XXX: not binary safe, discards returned length */
203209
php_url_decode(var, strlen(var));
204-
php_url_decode(val, strlen(val));
205-
php_register_variable(var, val, array_ptr ELS_CC PLS_CC);
210+
val_len = php_url_decode(val, strlen(val));
211+
php_register_variable_safe(var, val, val_len, array_ptr ELS_CC PLS_CC);
206212
}
207213
var = php_strtok_r(NULL, "&", &strtok_buf);
208214
}
@@ -282,11 +288,12 @@ void php_treat_data(int arg, char *str, zval* destArray ELS_DC PLS_DC SLS_DC)
282288
while (var) {
283289
val = strchr(var, '=');
284290
if (val) { /* have a value */
291+
int val_len;
292+
285293
*val++ = '\0';
286-
/* FIXME: XXX: not binary safe, discards returned length */
287294
php_url_decode(var, strlen(var));
288-
php_url_decode(val, strlen(val));
289-
php_register_variable(var, val, array_ptr ELS_CC PLS_CC);
295+
val_len = php_url_decode(val, strlen(val));
296+
php_register_variable_safe(var, val, val_len, array_ptr ELS_CC PLS_CC);
290297
}
291298
if (arg == PARSE_COOKIE) {
292299
var = php_strtok_r(NULL, ";", &strtok_buf);

main/php_variables.h

+2
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@
3333
void php_treat_data(int arg, char *str, zval* destArray ELS_DC PLS_DC SLS_DC);
3434
PHPAPI void php_import_environment_variables(zval *array_ptr ELS_DC PLS_DC);
3535
PHPAPI void php_register_variable(char *var, char *val, pval *track_vars_array ELS_DC PLS_DC);
36+
/* binary-safe version */
37+
PHPAPI void php_register_variable_safe(char *var, char *val, int val_len, pval *track_vars_array ELS_DC PLS_DC);
3638
PHPAPI void php_register_variable_ex(char *var, zval *val, pval *track_vars_array ELS_DC PLS_DC);
3739

3840

0 commit comments

Comments
 (0)