Re: lt_dlerror may cause potential issue in multi-thread environment

Nick Gorham <[email protected]> Fri, 12 Apr 2013 07:59:02 +0100
Newsgroups gmane.comp.db.unixodbc.devel
Message-ID <[email protected]>
On 12/04/13 02:40, xiaonan wrote:
>  Hi, Nick:
>
>     Because lt_dlerror() function is not thread-safe, in the following 
> code:

Ok, I misunderstood your problem. I would say the solution is to wrap 
the calls with the mutext to force it into being thread safe. But you 
still run the risk if the driver does the same thing and not using the 
mutext so it will still have the same problem.
>
>     if ( !(connection -> dl_handle = odbc_dlopen( driver_lib )))
>     {
>         char txt[ 2048 ];
>
>         sprintf( txt, "Can't open lib '%s' : %s",
>                 driver_lib, lt_dlerror());
>
>         ......
>
>         return 0;
>     }
>
>     In multi-thread environment, the lt_dlerror() may return other 
> thread's error, or even NULL.
>
>     In your latest modif! ication:
>
>     if ( !(connection -> dl_handle = odbc_dlopen( driver_lib )))
>     {
>         char txt[ 2048 ];
>         const char *err;
>
>         err = lt_dlerror();
>
>         sprintf( txt, "Can't open lib '%s' : %s",
>                 driver_lib, err ? err : "NULL ERROR RETURN" );
>
>         ......
>         return 0;
>     }
>
>     This issue still exits.
>
>     Personally, I think the function of odbc_dlopen() can be modified 
> as this:
>
>     static void *odbc_dlopen( char *libname, cha! r *err );
>     {
>         ......
>         hand = lt_dlopen( libname );
>         if (hand)
>         {
>         }
>         else
>         {
>             sprintf(err, "%s", lt_dlerror());
>         }
>     }

Bit that still doesnt help. a context shift can happen between dlopen 
and dlerror so the error may relate to the other thread. If I understand 
correctly, all you have done is reduce the time between the dlopen and 
dlerror, its still not atomic.

-- 
Nick

_______________________________________________
unixODBC-dev mailing list
[email protected]
http://mailman.unixodbc.org/mailman/listinfo/unixodbc-dev