Skip to content
Closed
40 changes: 22 additions & 18 deletions main/php_variables.c
Original file line number Diff line number Diff line change
Expand Up @@ -496,30 +496,34 @@ SAPI_API SAPI_TREAT_DATA_FUNC(php_default_treat_data)
break;
}

/* Process cookie val and var.
* Value characters defined in RFC6265.4.1.1
* Name(token) characters defined in RFC6265.4.1.1. -> RFC2616.2.2
* According to PHP documentation, name have additional restrictions.
*/
size_t val_len;
size_t new_val_len;

if (val) { /* have a value */
size_t val_len;
size_t new_val_len;

*val++ = '\0';
php_url_decode(var, strlen(var));
val_len = php_url_decode(val, strlen(val));
val = estrndup(val, val_len);
if (sapi_module.input_filter(arg, var, &val, val_len, &new_val_len)) {
php_register_variable_safe(var, val, new_val_len, &array);

if (arg == PARSE_COOKIE) {
val_len = php_raw_url_decode(val, strlen(val));
} else {
val_len = php_url_decode(val, strlen(val));
}
efree(val);
} else {
size_t val_len;
size_t new_val_len;

php_url_decode(var, strlen(var));
val_len = 0;
val = estrndup("", val_len);
if (sapi_module.input_filter(arg, var, &val, val_len, &new_val_len)) {
php_register_variable_safe(var, val, new_val_len, &array);
}
efree(val);
val = "";
val_len = 0;
}

val = estrndup(val, val_len);
php_url_decode(var, strlen(var));
if (sapi_module.input_filter(arg, var, &val, val_len, &new_val_len)) {
php_register_variable_safe(var, val, new_val_len, &array);
}
efree(val);
next_cookie:
var = php_strtok_r(NULL, separator, &strtok_buf);
}
Expand Down
16 changes: 16 additions & 0 deletions tests/basic/bug78929.phpt
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
--TEST--
Bug #78929: Fix a cookie parsing value.
--INI--
max_input_vars=1000
filter.default=unsafe_raw
--COOKIE--
RFC6265=#$%&'()*+-./0123456789<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^_`abcdefghijklmnopqrstuvwxyz{|}~!
--FILE--
<?php
var_dump($_COOKIE);
?>
--EXPECT--
array(1) {
["RFC6265"]=>
string(89) "#$%&'()*+-./0123456789<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^_`abcdefghijklmnopqrstuvwxyz{|}~!"
}