Skip to content

Commit 8faaf3f

Browse files
committed
Merge branch 'PHP-8.3'
* PHP-8.3: Fix memory leaks in ext/sodium on failure of some functions
2 parents 4e99bb5 + af444f9 commit 8faaf3f

File tree

2 files changed

+23
-0
lines changed

2 files changed

+23
-0
lines changed

ext/sodium/libsodium.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -992,6 +992,7 @@ PHP_FUNCTION(sodium_crypto_sign_publickey_from_secretkey)
992992

993993
if (crypto_sign_ed25519_sk_to_pk((unsigned char *) ZSTR_VAL(publickey),
994994
(const unsigned char *) secretkey) != 0) {
995+
zend_string_efree(publickey);
995996
zend_throw_exception(sodium_exception_ce,
996997
"internal error", 0);
997998
RETURN_THROWS();
@@ -2705,6 +2706,7 @@ PHP_FUNCTION(sodium_crypto_kx_seed_keypair)
27052706
crypto_generichash(sk, crypto_kx_SECRETKEYBYTES,
27062707
seed, crypto_kx_SEEDBYTES, NULL, 0);
27072708
if (crypto_scalarmult_base(pk, sk) != 0) {
2709+
zend_string_efree(keypair);
27082710
zend_throw_exception(sodium_exception_ce, "internal error", 0);
27092711
RETURN_THROWS();
27102712
}
@@ -2726,6 +2728,7 @@ PHP_FUNCTION(sodium_crypto_kx_keypair)
27262728
pk = sk + crypto_kx_SECRETKEYBYTES;
27272729
randombytes_buf(sk, crypto_kx_SECRETKEYBYTES);
27282730
if (crypto_scalarmult_base(pk, sk) != 0) {
2731+
zend_string_efree(keypair);
27292732
zend_throw_exception(sodium_exception_ce, "internal error", 0);
27302733
RETURN_THROWS();
27312734
}
@@ -2902,6 +2905,7 @@ PHP_FUNCTION(sodium_crypto_auth)
29022905
if (crypto_auth((unsigned char *) ZSTR_VAL(mac),
29032906
(const unsigned char *) msg, msg_len,
29042907
(const unsigned char *) key) != 0) {
2908+
zend_string_efree(mac);
29052909
zend_throw_exception(sodium_exception_ce, "internal error", 0);
29062910
RETURN_THROWS();
29072911
}
@@ -2961,6 +2965,7 @@ PHP_FUNCTION(sodium_crypto_sign_ed25519_sk_to_curve25519)
29612965

29622966
if (crypto_sign_ed25519_sk_to_curve25519((unsigned char *) ZSTR_VAL(ecdhkey),
29632967
(const unsigned char *) eddsakey) != 0) {
2968+
zend_string_efree(ecdhkey);
29642969
zend_throw_exception(sodium_exception_ce, "conversion failed", 0);
29652970
RETURN_THROWS();
29662971
}
@@ -2988,6 +2993,7 @@ PHP_FUNCTION(sodium_crypto_sign_ed25519_pk_to_curve25519)
29882993

29892994
if (crypto_sign_ed25519_pk_to_curve25519((unsigned char *) ZSTR_VAL(ecdhkey),
29902995
(const unsigned char *) eddsakey) != 0) {
2996+
zend_string_efree(ecdhkey);
29912997
zend_throw_exception(sodium_exception_ce, "conversion failed", 0);
29922998
RETURN_THROWS();
29932999
}
@@ -3292,6 +3298,7 @@ PHP_FUNCTION(sodium_pad)
32923298
#if SODIUM_LIBRARY_VERSION_MAJOR > 9 || (SODIUM_LIBRARY_VERSION_MAJOR == 9 && SODIUM_LIBRARY_VERSION_MINOR >= 6)
32933299
if (sodium_pad(NULL, (unsigned char *) ZSTR_VAL(padded), unpadded_len,
32943300
(size_t) blocksize, xpadded_len + 1U) != 0) {
3301+
zend_string_efree(padded);
32953302
zend_throw_exception(sodium_exception_ce, "internal error", 0);
32963303
RETURN_THROWS();
32973304
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
--TEST--
2+
Memory leak on sodium_crypto_sign_ed25519_pk_to_curve25519() failure
3+
--EXTENSIONS--
4+
sodium
5+
--FILE--
6+
<?php
7+
8+
try {
9+
sodium_crypto_sign_ed25519_pk_to_curve25519(str_repeat("\x00", SODIUM_CRYPTO_SIGN_PUBLICKEYBYTES));
10+
} catch (SodiumException $e) {
11+
echo $e->getMessage();
12+
}
13+
14+
?>
15+
--EXPECT--
16+
conversion failed

0 commit comments

Comments
 (0)