Skip to content
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
initial patch
  • Loading branch information
LamentXU123 committed Apr 13, 2026
commit e24a9d65c646df8c9eba19a5794625c2e1a31709
27 changes: 27 additions & 0 deletions ext/standard/tests/url/gh21738.phpt
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
--TEST--
GH-21738 (Avoid UB when urldecode() inspects non-ASCII bytes)
--FILE--
<?php

$tests = [
"%\x80A",
"%A\x80",
"%\xFFA",
"%F\xFF",
];

foreach ($tests as $test) {
var_dump(bin2hex(urldecode($test)));
var_dump(bin2hex(rawurldecode($test)));
}

?>
--EXPECT--
string(6) "258041"
string(6) "258041"
string(6) "254180"
string(6) "254180"
string(6) "25ff41"
string(6) "25ff41"
string(6) "2546ff"
string(6) "2546ff"
8 changes: 4 additions & 4 deletions ext/standard/url.c
Original file line number Diff line number Diff line change
Expand Up @@ -591,8 +591,8 @@ PHPAPI size_t php_url_decode_ex(char *dest, const char *src, size_t src_len)
if (*data == '+') {
*dest = ' ';
}
else if (*data == '%' && src_len >= 2 && isxdigit((int) *(data + 1))
&& isxdigit((int) *(data + 2))) {
else if (*data == '%' && src_len >= 2 && isxdigit((unsigned char) *(data + 1))
&& isxdigit((unsigned char) *(data + 2))) {
*dest = (char) php_htoi(data + 1);
data += 2;
src_len -= 2;
Expand Down Expand Up @@ -664,8 +664,8 @@ PHPAPI size_t php_raw_url_decode_ex(char *dest, const char *src, size_t src_len)
const char *data = src;

while (src_len--) {
if (*data == '%' && src_len >= 2 && isxdigit((int) *(data + 1))
&& isxdigit((int) *(data + 2))) {
if (*data == '%' && src_len >= 2 && isxdigit((unsigned char) *(data + 1))
&& isxdigit((unsigned char) *(data + 2))) {
*dest = (char) php_htoi(data + 1);
data += 2;
src_len -= 2;
Expand Down
Loading