From 23e6a482cc7f3d5859e384ce1be6e6dcb00072c5 Mon Sep 17 00:00:00 2001 From: Ramiro Polla Date: Tue, 9 Dec 2008 21:14:31 +0000 Subject: Fix bug reported by Dan DuVarney, based on a patch by himself. POSIX says: If no dynamic linking errors have occurred since the last invocation of dlerror(), dlerror() shall return NULL. The code was returning an empty string. The way dlerror( ) returns the error string has been changed. --- dlfcn.c | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/dlfcn.c b/dlfcn.c index f0efc22..14eecef 100644 --- a/dlfcn.c +++ b/dlfcn.c @@ -105,7 +105,7 @@ static void global_rem( HMODULE hModule ) * the limit. */ static char error_buffer[65535]; -static int dlerror_was_last_call; +static char *current_error; static int copy_string( char *dest, int dest_size, const char *src ) { @@ -153,6 +153,8 @@ static void save_err_str( const char *str ) if( error_buffer[pos-2] == '\r' && error_buffer[pos-1] == '\n' ) error_buffer[pos-2] = '\0'; } + + current_error = error_buffer; } static void save_err_ptr( const void *ptr ) @@ -169,7 +171,7 @@ void *dlopen( const char *file, int mode ) HMODULE hModule; UINT uMode; - dlerror_was_last_call = 0; + current_error = NULL; /* Do not let Windows display the critical-error-handler message box */ uMode = SetErrorMode( SEM_FAILCRITICALERRORS ); @@ -238,7 +240,7 @@ int dlclose( void *handle ) HMODULE hModule = (HMODULE) handle; BOOL ret; - dlerror_was_last_call = 0; + current_error = NULL; ret = FreeLibrary( hModule ); @@ -260,7 +262,7 @@ void *dlsym( void *handle, const char *name ) { FARPROC symbol; - dlerror_was_last_call = 0; + current_error = NULL; symbol = GetProcAddress( handle, name ); @@ -300,13 +302,12 @@ void *dlsym( void *handle, const char *name ) char *dlerror( void ) { + char *error_pointer = current_error; + /* POSIX says that invoking dlerror( ) a second time, immediately following * a prior invocation, shall result in NULL being returned. */ - if( dlerror_was_last_call ) - return NULL; - - dlerror_was_last_call = 1; + current_error = NULL; - return error_buffer; + return error_pointer; } -- cgit v1.2.3-55-g6feb