@@ -345,16 +345,22 @@ def _encode_authority_information_access(backend, authority_info_access):
345
345
aia = backend ._lib .sk_ACCESS_DESCRIPTION_new_null ()
346
346
backend .openssl_assert (aia != backend ._ffi .NULL )
347
347
aia = backend ._ffi .gc (
348
- aia , backend ._lib .sk_ACCESS_DESCRIPTION_free
348
+ aia ,
349
+ lambda x : backend ._lib .sk_ACCESS_DESCRIPTION_pop_free (
350
+ x , backend ._ffi .addressof (
351
+ backend ._lib ._original_lib , "ACCESS_DESCRIPTION_free"
352
+ )
353
+ )
349
354
)
350
355
for access_description in authority_info_access :
351
356
ad = backend ._lib .ACCESS_DESCRIPTION_new ()
352
357
method = _txt2obj (
353
358
backend , access_description .access_method .dotted_string
354
359
)
355
- gn = _encode_general_name (backend , access_description .access_location )
360
+ _encode_general_name_preallocated (
361
+ backend , access_description .access_location , ad .location
362
+ )
356
363
ad .method = method
357
- ad .location = gn
358
364
res = backend ._lib .sk_ACCESS_DESCRIPTION_push (aia , ad )
359
365
backend .openssl_assert (res >= 1 )
360
366
@@ -385,8 +391,12 @@ def _encode_subject_key_identifier(backend, ski):
385
391
386
392
387
393
def _encode_general_name (backend , name ):
394
+ gn = backend ._lib .GENERAL_NAME_new ()
395
+ return _encode_general_name_preallocated (backend , name , gn )
396
+
397
+
398
+ def _encode_general_name_preallocated (backend , name , gn ):
388
399
if isinstance (name , x509 .DNSName ):
389
- gn = backend ._lib .GENERAL_NAME_new ()
390
400
backend .openssl_assert (gn != backend ._ffi .NULL )
391
401
gn .type = backend ._lib .GEN_DNS
392
402
@@ -400,7 +410,6 @@ def _encode_general_name(backend, name):
400
410
backend .openssl_assert (res == 1 )
401
411
gn .d .dNSName = ia5
402
412
elif isinstance (name , x509 .RegisteredID ):
403
- gn = backend ._lib .GENERAL_NAME_new ()
404
413
backend .openssl_assert (gn != backend ._ffi .NULL )
405
414
gn .type = backend ._lib .GEN_RID
406
415
obj = backend ._lib .OBJ_txt2obj (
@@ -409,13 +418,11 @@ def _encode_general_name(backend, name):
409
418
backend .openssl_assert (obj != backend ._ffi .NULL )
410
419
gn .d .registeredID = obj
411
420
elif isinstance (name , x509 .DirectoryName ):
412
- gn = backend ._lib .GENERAL_NAME_new ()
413
421
backend .openssl_assert (gn != backend ._ffi .NULL )
414
422
dir_name = _encode_name (backend , name .value )
415
423
gn .type = backend ._lib .GEN_DIRNAME
416
424
gn .d .directoryName = dir_name
417
425
elif isinstance (name , x509 .IPAddress ):
418
- gn = backend ._lib .GENERAL_NAME_new ()
419
426
backend .openssl_assert (gn != backend ._ffi .NULL )
420
427
if isinstance (name .value , ipaddress .IPv4Network ):
421
428
packed = (
@@ -433,7 +440,6 @@ def _encode_general_name(backend, name):
433
440
gn .type = backend ._lib .GEN_IPADD
434
441
gn .d .iPAddress = ipaddr
435
442
elif isinstance (name , x509 .OtherName ):
436
- gn = backend ._lib .GENERAL_NAME_new ()
437
443
backend .openssl_assert (gn != backend ._ffi .NULL )
438
444
other_name = backend ._lib .OTHERNAME_new ()
439
445
backend .openssl_assert (other_name != backend ._ffi .NULL )
@@ -456,7 +462,6 @@ def _encode_general_name(backend, name):
456
462
gn .type = backend ._lib .GEN_OTHERNAME
457
463
gn .d .otherName = other_name
458
464
elif isinstance (name , x509 .RFC822Name ):
459
- gn = backend ._lib .GENERAL_NAME_new ()
460
465
backend .openssl_assert (gn != backend ._ffi .NULL )
461
466
# ia5strings are supposed to be ITU T.50 but to allow round-tripping
462
467
# of broken certs that encode utf8 we'll encode utf8 here too.
@@ -465,7 +470,6 @@ def _encode_general_name(backend, name):
465
470
gn .type = backend ._lib .GEN_EMAIL
466
471
gn .d .rfc822Name = asn1_str
467
472
elif isinstance (name , x509 .UniformResourceIdentifier ):
468
- gn = backend ._lib .GENERAL_NAME_new ()
469
473
backend .openssl_assert (gn != backend ._ffi .NULL )
470
474
# ia5strings are supposed to be ITU T.50 but to allow round-tripping
471
475
# of broken certs that encode utf8 we'll encode utf8 here too.
0 commit comments