@@ -73,6 +73,15 @@ macro_rules! error_checked {
73
73
Ok ( ( ) )
74
74
}
75
75
} } ;
76
+ ( $block: expr, $err_callback: expr) => { {
77
+ let res = $block;
78
+ if res != 0 {
79
+ $err_callback( ) ;
80
+ Err ( TlsError :: MbedTlsError ( res) )
81
+ } else {
82
+ Ok ( ( ) )
83
+ }
84
+ } } ;
76
85
}
77
86
78
87
#[ derive( Debug , Clone , Copy , PartialEq ) ]
@@ -319,6 +328,7 @@ impl<'a> Certificates<'a> {
319
328
let ssl_config =
320
329
calloc ( 1 , size_of :: < mbedtls_ssl_config > ( ) as u32 ) as * mut mbedtls_ssl_config ;
321
330
if ssl_config. is_null ( ) {
331
+ free ( drbg_context as * const _ ) ;
322
332
free ( ssl_context as * const _ ) ;
323
333
return Err ( TlsError :: OutOfMemory ) ;
324
334
}
@@ -365,12 +375,31 @@ impl<'a> Certificates<'a> {
365
375
mbedtls_ctr_drbg_init ( drbg_context) ;
366
376
mbedtls_ssl_conf_rng ( ssl_config, Some ( rng) , drbg_context as * mut c_void ) ;
367
377
368
- error_checked ! ( mbedtls_ssl_config_defaults(
369
- ssl_config,
370
- mode. to_mbed_tls( ) ,
371
- MBEDTLS_SSL_TRANSPORT_STREAM as i32 ,
372
- MBEDTLS_SSL_PRESET_DEFAULT as i32 ,
373
- ) ) ?;
378
+ // Closure to free all allocated resources in case of an error.
379
+ let cleanup = || {
380
+ mbedtls_ctr_drbg_free ( drbg_context) ;
381
+ mbedtls_ssl_config_free ( ssl_config) ;
382
+ mbedtls_ssl_free ( ssl_context) ;
383
+ mbedtls_x509_crt_free ( crt) ;
384
+ mbedtls_x509_crt_free ( certificate) ;
385
+ mbedtls_pk_free ( private_key) ;
386
+ free ( drbg_context as * const _ ) ;
387
+ free ( ssl_context as * const _ ) ;
388
+ free ( ssl_config as * const _ ) ;
389
+ free ( crt as * const _ ) ;
390
+ free ( certificate as * const _ ) ;
391
+ free ( private_key as * const _ ) ;
392
+ } ;
393
+
394
+ error_checked ! (
395
+ mbedtls_ssl_config_defaults(
396
+ ssl_config,
397
+ mode. to_mbed_tls( ) ,
398
+ MBEDTLS_SSL_TRANSPORT_STREAM as i32 ,
399
+ MBEDTLS_SSL_PRESET_DEFAULT as i32 ,
400
+ ) ,
401
+ cleanup
402
+ ) ?;
374
403
375
404
mbedtls_ssl_conf_min_version (
376
405
ssl_config,
@@ -393,36 +422,40 @@ impl<'a> Certificates<'a> {
393
422
let mut hostname = StrBuf :: new ( ) ;
394
423
hostname. append ( servername) ;
395
424
hostname. append_char ( '\0' ) ;
396
- error_checked ! ( mbedtls_ssl_set_hostname(
397
- ssl_context,
398
- hostname. as_str_ref( ) . as_ptr( ) as * const c_char
399
- ) ) ?;
425
+ error_checked ! (
426
+ mbedtls_ssl_set_hostname(
427
+ ssl_context,
428
+ hostname. as_str_ref( ) . as_ptr( ) as * const c_char
429
+ ) ,
430
+ cleanup
431
+ ) ?;
400
432
}
401
433
402
434
if let Some ( ca_chain) = self . ca_chain {
403
- error_checked ! ( mbedtls_x509_crt_parse(
404
- crt,
405
- ca_chain. as_ptr( ) ,
406
- ca_chain. len( ) ,
407
- ) ) ?;
435
+ error_checked ! (
436
+ mbedtls_x509_crt_parse( crt, ca_chain. as_ptr( ) , ca_chain. len( ) ) ,
437
+ cleanup
438
+ ) ?;
408
439
}
409
440
410
441
if let ( Some ( cert) , Some ( key) ) = ( self . certificate , self . private_key ) {
411
442
// Certificate
412
443
match cert. format {
413
444
CertificateFormat :: PEM => {
414
- error_checked ! ( mbedtls_x509_crt_parse(
415
- certificate,
416
- cert. as_ptr( ) ,
417
- cert. len( ) ,
418
- ) ) ?;
445
+ error_checked ! (
446
+ mbedtls_x509_crt_parse( certificate, cert. as_ptr( ) , cert. len( ) ) ,
447
+ cleanup
448
+ ) ?;
419
449
}
420
450
CertificateFormat :: DER => {
421
- error_checked ! ( mbedtls_x509_crt_parse_der_nocopy(
422
- certificate,
423
- cert. as_ptr( ) ,
424
- cert. len( ) ,
425
- ) ) ?;
451
+ error_checked ! (
452
+ mbedtls_x509_crt_parse_der_nocopy(
453
+ certificate,
454
+ cert. as_ptr( ) ,
455
+ cert. len( ) ,
456
+ ) ,
457
+ cleanup
458
+ ) ?;
426
459
}
427
460
}
428
461
@@ -432,21 +465,24 @@ impl<'a> Certificates<'a> {
432
465
} else {
433
466
( core:: ptr:: null ( ) , 0 )
434
467
} ;
435
- error_checked ! ( mbedtls_pk_parse_key(
436
- private_key,
437
- key. as_ptr( ) ,
438
- key. len( ) ,
439
- password_ptr,
440
- password_len,
441
- None ,
442
- core:: ptr:: null_mut( ) ,
443
- ) ) ?;
468
+ error_checked ! (
469
+ mbedtls_pk_parse_key(
470
+ private_key,
471
+ key. as_ptr( ) ,
472
+ key. len( ) ,
473
+ password_ptr,
474
+ password_len,
475
+ None ,
476
+ core:: ptr:: null_mut( ) ,
477
+ ) ,
478
+ cleanup
479
+ ) ?;
444
480
445
481
mbedtls_ssl_conf_own_cert ( ssl_config, certificate, private_key) ;
446
482
}
447
483
448
484
mbedtls_ssl_conf_ca_chain ( ssl_config, crt, core:: ptr:: null_mut ( ) ) ;
449
- error_checked ! ( mbedtls_ssl_setup( ssl_context, ssl_config) ) ?;
485
+ error_checked ! ( mbedtls_ssl_setup( ssl_context, ssl_config) , cleanup ) ?;
450
486
Ok ( (
451
487
drbg_context,
452
488
ssl_context,
0 commit comments