summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFrank Denis <github@pureftpd.org>2018-10-14 11:01:53 +0200
committerFrank Denis <github@pureftpd.org>2018-10-14 11:01:53 +0200
commitc4ea98455db3c7c56a7d00d15418fea4f18cc27b (patch)
tree772502693ec2ce6407b8335069dfdfcdfd84b2a7
parent1670c4679dc414cf83371de85f8cc5083de21414 (diff)
parent5d70165f632d8857f2e75975d5857fa29a68f3fc (diff)
downloadphp-git-c4ea98455db3c7c56a7d00d15418fea4f18cc27b.tar.gz
Merge branch 'PHP-7.2' into PHP-7.3
* PHP-7.2: ext/sodium: sodium_pad(): do not copy any bytes if the string is empty ext/sodium: Fix sodium_pad() with blocksize >= 256 ext/sodium: Use a correct max output size for base64 decoding ext/sodium: Avoid shifts wider than 32 bits on size_t values
-rw-r--r--ext/sodium/libsodium.c21
-rw-r--r--ext/sodium/tests/utils.phpt7
2 files changed, 21 insertions, 7 deletions
diff --git a/ext/sodium/libsodium.c b/ext/sodium/libsodium.c
index f9276b4aac..1c3b743d84 100644
--- a/ext/sodium/libsodium.c
+++ b/ext/sodium/libsodium.c
@@ -2780,7 +2780,7 @@ PHP_FUNCTION(sodium_base642bin)
"invalid base64 variant identifier", 0);
return;
}
- bin_len = b64_len / 4U * 3U;
+ bin_len = b64_len / 4U * 3U + 1U;
bin = zend_string_alloc(bin_len, 0);
if (sodium_base642bin((unsigned char *) ZSTR_VAL(bin), bin_len,
b64, b64_len,
@@ -3402,11 +3402,17 @@ PHP_FUNCTION(sodium_pad)
st = 1U;
i = 0U;
k = unpadded_len;
- for (j = 0U; j <= xpadded_len; j++) {
- ZSTR_VAL(padded)[j] = unpadded[i];
- k -= st;
- st = (~(((((k >> 48) | (k >> 32) | (k >> 16) | k) & 0xffff) - 1U) >> 16)) & 1U;
- i += st;
+ if (unpadded_len > 0) {
+ st = 1U;
+ i = 0U;
+ k = unpadded_len;
+ for (j = 0U; j <= xpadded_len; j++) {
+ ZSTR_VAL(padded)[j] = unpadded[i];
+ k -= st;
+ st = (size_t) (~(((( (((uint64_t) k) >> 48) | (((uint64_t) k) >> 32) |
+ (k >> 16) | k) & 0xffff) - 1U) >> 16)) & 1U;
+ i += st;
+ }
}
#if SODIUM_LIBRARY_VERSION_MAJOR > 9 || (SODIUM_LIBRARY_VERSION_MAJOR == 9 && SODIUM_LIBRARY_VERSION_MINOR >= 6)
if (sodium_pad(NULL, (unsigned char *) ZSTR_VAL(padded), unpadded_len,
@@ -3423,7 +3429,8 @@ PHP_FUNCTION(sodium_pad)
tail = &ZSTR_VAL(padded)[xpadded_len];
mask = 0U;
for (i = 0; i < blocksize; i++) {
- barrier_mask = (unsigned char) (((i ^ xpadlen) - 1U) >> 8);
+ barrier_mask = (unsigned char)
+ (((i ^ xpadlen) - 1U) >> ((sizeof(size_t) - 1U) * CHAR_BIT));
tail[-i] = (tail[-i] & mask) | (0x80 & barrier_mask);
mask |= barrier_mask;
}
diff --git a/ext/sodium/tests/utils.phpt b/ext/sodium/tests/utils.phpt
index ff380ff78c..4f99f75671 100644
--- a/ext/sodium/tests/utils.phpt
+++ b/ext/sodium/tests/utils.phpt
@@ -86,6 +86,12 @@ if (defined('SODIUM_BASE64_VARIANT_ORIGINAL')) {
} catch (Exception $e) {
var_dump('base64("O") case passed');
}
+ var_dump(sodium_base642bin('YWJjZA', SODIUM_BASE64_VARIANT_ORIGINAL_NO_PADDING));
+} else {
+ var_dump('base64("O1R") case passed');
+ var_dump('base64("O1") case passed');
+ var_dump('base64("O") case passed');
+ var_dump('abcd');
}
?>
@@ -107,3 +113,4 @@ bool(true)
string(25) "base64("O1R") case passed"
string(24) "base64("O1") case passed"
string(23) "base64("O") case passed"
+string(4) "abcd"