diff --git a/ext/standard/string.c b/ext/standard/string.c index 0aade780856b9..bf8e5640344eb 100644 --- a/ext/standard/string.c +++ b/ext/standard/string.c @@ -151,10 +151,19 @@ static char *php_bin2hex(const unsigned char *old, const size_t oldlen, size_t * static char *php_hex2bin(const unsigned char *old, const size_t oldlen, size_t *newlen) { size_t target_length = oldlen >> 1; + int e = oldlen & 1; + if (e) { + target_length++; + } register unsigned char *str = (unsigned char *)safe_emalloc(target_length, sizeof(char), 1); size_t i, j; for (i = j = 0; i < target_length; i++) { - char c = old[j++]; + char c; + if (j == 0 && e) { + c = '0'; + } else { + c = old[j++]; + } if (c >= '0' && c <= '9') { str[i] = (c - '0') << 4; } else if (c >= 'a' && c <= 'f') { diff --git a/ext/standard/tests/strings/61660.phpt b/ext/standard/tests/strings/61660.phpt new file mode 100644 index 0000000000000..5316b50a9b90b --- /dev/null +++ b/ext/standard/tests/strings/61660.phpt @@ -0,0 +1,9 @@ +--TEST-- +hex2bin() function +--FILE-- + +--EXPECT-- +012345