OSSL_FUNC_BIO_gets_fn *c_bio_gets;
OSSL_FUNC_BIO_puts_fn *c_bio_puts;
OSSL_FUNC_BIO_ctrl_fn *c_bio_ctrl;
+ OSSL_FUNC_BIO_up_ref_fn *c_bio_up_ref;
+ OSSL_FUNC_BIO_free_fn *c_bio_free;
} BIO_CORE_GLOBALS;
static void bio_core_globals_free(void *vbcg)
static int bio_core_free(BIO *bio)
{
+ BIO_CORE_GLOBALS *bcgbl = get_globals(bio->libctx);
+
BIO_set_init(bio, 0);
+ bcgbl->c_bio_free(BIO_get_data(bio));
return 1;
}
if ((outbio = BIO_new_ex(libctx, BIO_s_core())) == NULL)
return NULL;
+ if (!bcgbl->c_bio_up_ref(corebio)) {
+ BIO_free(outbio);
+ return NULL;
+ }
BIO_set_data(outbio, corebio);
return outbio;
}
if (bcgbl->c_bio_ctrl == NULL)
bcgbl->c_bio_ctrl = OSSL_FUNC_BIO_ctrl(fns);
break;
+ case OSSL_FUNC_BIO_UP_REF:
+ if (bcgbl->c_bio_up_ref == NULL)
+ bcgbl->c_bio_up_ref = OSSL_FUNC_BIO_up_ref(fns);
+ break;
+ case OSSL_FUNC_BIO_FREE:
+ if (bcgbl->c_bio_free == NULL)
+ bcgbl->c_bio_free = OSSL_FUNC_BIO_free(fns);
+ break;
}
}
return BIO_ctrl(bio->bio, cmd, num, ptr);
}
+static int tst_bio_core_up_ref(OSSL_CORE_BIO *bio)
+{
+ return BIO_up_ref(bio->bio);
+}
+
+static int tst_bio_core_free(OSSL_CORE_BIO *bio)
+{
+ return BIO_free(bio->bio);
+}
+
static const OSSL_DISPATCH biocbs[] = {
{ OSSL_FUNC_BIO_READ_EX, (void (*)(void))tst_bio_core_read_ex },
{ OSSL_FUNC_BIO_WRITE_EX, (void (*)(void))tst_bio_core_write_ex },
{ OSSL_FUNC_BIO_GETS, (void (*)(void))tst_bio_core_gets },
{ OSSL_FUNC_BIO_PUTS, (void (*)(void))tst_bio_core_puts },
{ OSSL_FUNC_BIO_CTRL, (void (*)(void))tst_bio_core_ctrl },
+ { OSSL_FUNC_BIO_UP_REF, (void (*)(void))tst_bio_core_up_ref },
+ { OSSL_FUNC_BIO_FREE, (void (*)(void))tst_bio_core_free },
{ 0, NULL }
};