diff options
-rw-r--r-- | src/OpenSSL/crypto.py | 13 | ||||
-rw-r--r-- | tests/test_crypto.py | 3 |
2 files changed, 15 insertions, 1 deletions
diff --git a/src/OpenSSL/crypto.py b/src/OpenSSL/crypto.py index 84f92b1..4265525 100644 --- a/src/OpenSSL/crypto.py +++ b/src/OpenSSL/crypto.py @@ -1017,9 +1017,20 @@ class X509Req(object): """ exts = [] native_exts_obj = _lib.X509_REQ_get_extensions(self._req) + native_exts_obj = _ffi.gc( + native_exts_obj, + lambda x: _lib.sk_X509_EXTENSION_pop_free( + x, + _ffi.addressof(_lib._original_lib, "X509_EXTENSION_free"), + ), + ) + for i in range(_lib.sk_X509_EXTENSION_num(native_exts_obj)): ext = X509Extension.__new__(X509Extension) - ext._extension = _lib.sk_X509_EXTENSION_value(native_exts_obj, i) + extension = _lib.X509_EXTENSION_dup( + _lib.sk_X509_EXTENSION_value(native_exts_obj, i) + ) + ext._extension = _ffi.gc(extension, _lib.X509_EXTENSION_free) exts.append(ext) return exts diff --git a/tests/test_crypto.py b/tests/test_crypto.py index 62b1690..265d31e 100644 --- a/tests/test_crypto.py +++ b/tests/test_crypto.py @@ -1625,6 +1625,9 @@ class TestX509Req(_PKeyInteractionTestsMixin): assert exts[1].get_short_name() == b"keyUsage" assert exts[1].get_critical() == 0 assert exts[1].get_data() == b"\x03\x02\x07\x80" + # Requesting it a second time should return the same list + exts = request.get_extensions() + assert len(exts) == 2 def test_add_extensions_wrong_args(self): """ |