Fix auto-discovery of ENGINEs, ported from HEAD.

NB, this fixes a regression relative to 0.9.7 and the documented behaviour,
but it would make sense for distro maintainers and others with an interest
in system behaviour to test with this change. The fix re-enables behaviour
that was broken and thus inherently disabled. In particular, if you
register an ENGINE implementation, and that ENGINE is able to successfully
self-initialise on the host, it will get used automatically (as claimed in
the documentation and as was the case for 0.9.7) - this was not the case
with 0.9.8 until now because of a bug.

PR: 1668
Submitted by: Ian Lister
Reviewed by: Geoff Thorpe
This commit is contained in:
Geoff Thorpe 2008-04-28 21:45:43 +00:00
parent 292248b8c2
commit 98bd148b1a
2 changed files with 16 additions and 4 deletions

12
CHANGES
View file

@ -4,6 +4,18 @@
Changes between 0.9.8g and 0.9.8h [xx XXX xxxx] Changes between 0.9.8g and 0.9.8h [xx XXX xxxx]
*) Reverse ENGINE-internal logic for caching default ENGINE handles.
This was broken until now in 0.9.8 releases, such that the only way
a registered ENGINE could be used (assuming it initialises
successfully on the host) was to explicitly set it as the default
for the relevant algorithms. This is in contradiction with 0.9.7
behaviour and the documentation. With this fix, when an ENGINE is
registered into a given algorithm's table of implementations, the
'uptodate' flag is reset so that auto-discovery will be used next
time a new context for that algorithm attempts to select an
implementation.
[Ian Lister (tweaked by Geoff Thorpe)]
*) Backport of CMS code to OpenSSL 0.9.8. This differs from the 0.9.9 *) Backport of CMS code to OpenSSL 0.9.8. This differs from the 0.9.9
implemention in the following ways: implemention in the following ways:

View file

@ -135,7 +135,7 @@ int engine_table_register(ENGINE_TABLE **table, ENGINE_CLEANUP_CB *cleanup,
{ {
fnd = OPENSSL_malloc(sizeof(ENGINE_PILE)); fnd = OPENSSL_malloc(sizeof(ENGINE_PILE));
if(!fnd) goto end; if(!fnd) goto end;
fnd->uptodate = 0; fnd->uptodate = 1;
fnd->nid = *nids; fnd->nid = *nids;
fnd->sk = sk_ENGINE_new_null(); fnd->sk = sk_ENGINE_new_null();
if(!fnd->sk) if(!fnd->sk)
@ -152,7 +152,7 @@ int engine_table_register(ENGINE_TABLE **table, ENGINE_CLEANUP_CB *cleanup,
if(!sk_ENGINE_push(fnd->sk, e)) if(!sk_ENGINE_push(fnd->sk, e))
goto end; goto end;
/* "touch" this ENGINE_PILE */ /* "touch" this ENGINE_PILE */
fnd->uptodate = 1; fnd->uptodate = 0;
if(setdefault) if(setdefault)
{ {
if(!engine_unlocked_init(e)) if(!engine_unlocked_init(e))
@ -164,6 +164,7 @@ int engine_table_register(ENGINE_TABLE **table, ENGINE_CLEANUP_CB *cleanup,
if(fnd->funct) if(fnd->funct)
engine_unlocked_finish(fnd->funct, 0); engine_unlocked_finish(fnd->funct, 0);
fnd->funct = e; fnd->funct = e;
fnd->uptodate = 1;
} }
nids++; nids++;
} }
@ -179,8 +180,7 @@ static void int_unregister_cb(ENGINE_PILE *pile, ENGINE *e)
while((n = sk_ENGINE_find(pile->sk, e)) >= 0) while((n = sk_ENGINE_find(pile->sk, e)) >= 0)
{ {
(void)sk_ENGINE_delete(pile->sk, n); (void)sk_ENGINE_delete(pile->sk, n);
/* "touch" this ENGINE_CIPHER */ pile->uptodate = 0;
pile->uptodate = 1;
} }
if(pile->funct == e) if(pile->funct == e)
{ {