summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMoriyoshi Koizumi <moriyoshi@php.net>2003-01-12 21:05:22 +0000
committerMoriyoshi Koizumi <moriyoshi@php.net>2003-01-12 21:05:22 +0000
commit1fec8e3d1356c3e06271f9b911d14f26b08af205 (patch)
treebc900cc2788f03018458533d69d542410510c6c2
parent33b67ab868ac9637139dbf92b17840aacf8183c1 (diff)
downloadphp-git-1fec8e3d1356c3e06271f9b911d14f26b08af205.tar.gz
Fixed a bug of the base64 decoder that a sequence of intervening
characters that are supposed to be ignored by the decoder cause output corruption.
-rw-r--r--ext/standard/filters.c11
1 files changed, 8 insertions, 3 deletions
diff --git a/ext/standard/filters.c b/ext/standard/filters.c
index be7346fc2e..9966305c70 100644
--- a/ext/standard/filters.c
+++ b/ext/standard/filters.c
@@ -526,9 +526,6 @@ static php_conv_err_t php_conv_base64_decode_convert(php_conv_base64_decode *ins
}
if ((pack_bcnt | ustat) == 0) {
if (ocnt < 1) {
- urem |= (pack << urem_nbits);
- urem_nbits += 8;
-
err = PHP_CONV_ERR_TOO_BIG;
break;
}
@@ -539,6 +536,14 @@ static php_conv_err_t php_conv_base64_decode_convert(php_conv_base64_decode *ins
}
}
+ if (urem_nbits >= pack_bcnt) {
+ urem |= (pack << (urem_nbits - pack_bcnt));
+ urem_nbits += (nbitsof_pack - pack_bcnt);
+ } else {
+ urem |= (pack >> (pack_bcnt - urem_nbits));
+ urem_nbits += (nbitsof_pack - pack_bcnt);
+ }
+
inst->urem = urem;
inst->urem_nbits = urem_nbits;
inst->ustat = ustat;