static void int_cleanup_cb(ENGINE_PILE *p) { sk_ENGINE_free(p->sk); if(p->funct) engine_unlocked_finish(p->funct, 0); OPENSSL_free(p); }
static void int_engine_module_finish(CONF_IMODULE *md) { ENGINE *e; while ((e = sk_ENGINE_pop(initialized_engines))) ENGINE_finish(e); sk_ENGINE_free(initialized_engines); initialized_engines = NULL; }
static void int_cleanup_cb_doall(ENGINE_PILE *p) { if (!p) return; sk_ENGINE_free(p->sk); if (p->funct) engine_unlocked_finish(p->funct, 0); OPENSSL_free(p); }
/* * Privately exposed (via eng_int.h) functions for adding and/or removing * ENGINEs from the implementation table */ int engine_table_register(ENGINE_TABLE **table, ENGINE_CLEANUP_CB *cleanup, ENGINE *e, const int *nids, int num_nids, int setdefault) { int ret = 0, added = 0; ENGINE_PILE tmplate, *fnd; CRYPTO_THREAD_write_lock(global_engine_lock); if (!(*table)) added = 1; if (!int_table_check(table, 1)) goto end; if (added) /* The cleanup callback needs to be added */ engine_cleanup_add_first(cleanup); while (num_nids--) { tmplate.nid = *nids; fnd = lh_ENGINE_PILE_retrieve(&(*table)->piles, &tmplate); if (!fnd) { fnd = OPENSSL_malloc(sizeof(*fnd)); if (fnd == NULL) goto end; fnd->uptodate = 1; fnd->nid = *nids; fnd->sk = sk_ENGINE_new_null(); if (!fnd->sk) { OPENSSL_free(fnd); goto end; } fnd->funct = NULL; (void)lh_ENGINE_PILE_insert(&(*table)->piles, fnd); if (lh_ENGINE_PILE_retrieve(&(*table)->piles, &tmplate) != fnd) { sk_ENGINE_free(fnd->sk); OPENSSL_free(fnd); goto end; } } /* A registration shouldn't add duplicate entries */ (void)sk_ENGINE_delete_ptr(fnd->sk, e); /* * if 'setdefault', this ENGINE goes to the head of the list */ if (!sk_ENGINE_push(fnd->sk, e)) goto end; /* "touch" this ENGINE_PILE */ fnd->uptodate = 0; if (setdefault) { if (!engine_unlocked_init(e)) { ENGINEerr(ENGINE_F_ENGINE_TABLE_REGISTER, ENGINE_R_INIT_FAILED); goto end; } if (fnd->funct) engine_unlocked_finish(fnd->funct, 0); fnd->funct = e; fnd->uptodate = 1; } nids++; } ret = 1; end: CRYPTO_THREAD_unlock(global_engine_lock); return ret; }