On June 14, 2004 10:20 am, Kevin Stefanik wrote:
[snip]
> #define IMPLEMENT_DYNAMIC_BIND_FN(fn) \
>       int bind_engine(ENGINE *e, const char *id, const dynamic_fns *fns) { \
>               if (ERR_get_implementation() != fns->err_fns) \
>                       { \
>                       if(!CRYPTO_set_mem_functions(fns->mem_fns.malloc_cb, \
>                               fns->mem_fns.realloc_cb, fns->mem_fns.free_cb)) \
>                               return 0; \
>                       CRYPTO_set_locking_callback(fns->lock_fns.lock_locking_cb); \
>                       CRYPTO_set_add_lock_callback(fns->lock_fns.lock_add_lock_cb); \
>                       
> CRYPTO_set_dynlock_create_callback(fns->lock_fns.dynlock_create_cb);
> \ CRYPTO_set_dynlock_lock_callback(fns->lock_fns.dynlock_lock_cb); \
> CRYPTO_set_dynlock_destroy_callback(fns->lock_fns.dynlock_destroy_cb);
> \ if(!CRYPTO_set_ex_data_implementation(fns->ex_data_fns)) \
>                               return 0; \
>                       if(!ERR_set_implementation(fns->err_fns)) return 0; \
>                       } \
>               if(!fn(e,id)) return 0; \
>               return 1; }
>
> If the library is statically compiled, then the ERR_get_implementation
> will initialize the static err_fns to err_defaults.  The
> ERR_set_implementation will then report an error because that static
> err_fns is not null.

But ERR_set_implementation() should not be called because 
ERR_get_implementation() should equal fns->err_fns in the static case and 
so the code path should skip straight to the call to fn(). However ...

> I think this effectively makes statically linked engines impossible -
> which I really don't mind.  Can we just always use shared engines as of
> 0.9.7d?

Actually it seems to me to be the other way around. It appears that this 
has probably broken the use of shared-lib engines on any platforms where 
the loaded shared-lib has its own copy of libcrypto functions/state. What 
exactly have you been seeing to make you believe it's the other way 
round?

Thanks for the head's up, we'll need to look into this - but I'd also like 
to know why you're seeing (or think you're seeing) errors in the 
statically-compiled case? Can you alter the macro to display the values 
of ERR_get_implementation() and fns->err_fns before that if(){} branch, 
as those values should match in the static case.

Cheers,
Geoff
-- 
Geoff Thorpe
[EMAIL PROTECTED]
http://www.geoffthorpe.net/

______________________________________________________________________
OpenSSL Project                                 http://www.openssl.org
Development Mailing List                       [EMAIL PROTECTED]
Automated List Manager                           [EMAIL PROTECTED]

Reply via email to