This added check is actually for NOT failing in NON-strict mode.
The ch == -2 check later causes the desired failure in strict mode.
result = zend_string_alloc(length, 0);
/* run through the whole string, converting as we go */
- while (length-- > 0 && (ch = *current++) != '\0') {
+ while (length-- > 0) {
+ ch = *current++;
+ /* stop on null byte in non-strict mode (FIXME: is this really desired?) */
+ if (ch == 0 && !strict) {
+ break;
+ }
if (ch == base64_pad) {
/* fail if the padding character is second in a group (like V===) */
/* FIXME: why do we still allow invalid padding in other places in the middle of the string? */
--- /dev/null
+--TEST--
+Bug #72152 (base64_decode $strict fails to detect null byte)
+--FILE--
+<?php
+var_dump(base64_decode("\x00", true));
+var_dump(base64_decode("\x00VVVV", true));
+var_dump(base64_decode("VVVV\x00", true));
+--EXPECT--
+bool(false)
+bool(false)
+bool(false)