Hello all,

I am trying to use pkcs#11 engine as dynamic engine for Apache configured
with OpenSSL. I ran into segmentation faults when I hit Apache server with
multiple sslswamp clients. I tracked down the problem to
pk11_library_init() in hw_pk11.c where a child process tries to free the
memory allocated by parent thinking of it as a memory leak.

Code snippet and comments are as below.
        /*
         * pk11_library_initialized is set to 0 in pk11_finish() which is
called
         * from ENGINE_finish(). However, if there is still at least one
         * existing functional reference to the engine (see engine(3) for
more
         * information), pk11_finish() is skipped. For example, this can
happen
         * if an application forgets to clear one cipher context. In case
of a
         * fork() when the application is finishing the engine so that it
can be
         * reinitialized in the child, forgotten functional reference causes
         * pk11_library_initialized to stay 1. In that case we need the PID
         * check so that we properly initialize the engine again.
         */
        if (pk11_library_initialized)
                {
                if (pk11_pid == getpid())
                        {
                        return (1);
                        }
                else
                        {
                        global_session = CK_INVALID_HANDLE;
                        /*
                         * free the locks first to prevent memory leak in
case
                         * the application calls fork() without finishing
the
                         * engine first.
                         */
                        pk11_free_all_locks();
                        }
                }
******************
pk11_free_locks() is freeing the memory allocated for find_locks by the
parent.  If I comment this out, my test works fine. But I stopped from
making it a real fix because of the preceding comment.

Why is it necessary that a parent should do ENGINE_finish first before
forking? Can't a process simultaneously use the pkcs#11 engine with it's
child?

Thanks,
Thulasi.

Reply via email to