1- /* $OpenBSD: bio_chain.c,v 1.15 2023/03/04 12:13:11 tb Exp $ */
1+ /* $OpenBSD: bio_chain.c,v 1.16 2023/08/07 11:00:54 tb Exp $ */
22/*
33 * Copyright (c) 2022 Theo Buehler <[email protected] > 44 *
@@ -460,6 +460,47 @@ bio_set_next_link_test(void)
460460 return link_chains (use_bio_push );
461461}
462462
463+ static long
464+ dup_leak_cb (BIO * bio , int cmd , const char * argp , int argi , long argl , long ret )
465+ {
466+ if (argi == BIO_CTRL_DUP )
467+ return 0 ;
468+
469+ return ret ;
470+ }
471+
472+ static int
473+ bio_dup_chain_leak (void )
474+ {
475+ BIO * bio [CHAIN_POP_LEN ];
476+ BIO * dup ;
477+ int failed = 1 ;
478+
479+ if (!bio_chain_create (BIO_s_null (), bio , nitems (bio )))
480+ goto err ;
481+
482+ if ((dup = BIO_dup_chain (bio [0 ])) == NULL ) {
483+ fprintf (stderr , "BIO_set_callback() failed\n" );
484+ goto err ;
485+ }
486+
487+ BIO_set_callback (bio [CHAIN_POP_LEN - 1 ], dup_leak_cb );
488+
489+ BIO_free_all (dup );
490+ if ((dup = BIO_dup_chain (bio [0 ])) != NULL ) {
491+ fprintf (stderr , "BIO_dup_chain() succeeded unexpectedly\n" );
492+ BIO_free_all (dup );
493+ goto err ;
494+ }
495+
496+ failed = 0 ;
497+
498+ err :
499+ bio_chain_destroy (bio , nitems (bio ));
500+
501+ return failed ;
502+ }
503+
463504int
464505main (int argc , char * * argv )
465506{
@@ -468,6 +509,7 @@ main(int argc, char **argv)
468509 failed |= bio_chain_pop_test ();
469510 failed |= bio_push_link_test ();
470511 failed |= bio_set_next_link_test ();
512+ failed |= bio_dup_chain_leak ();
471513
472514 return failed ;
473515}
0 commit comments