aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRamiro Polla <ramiro.polla@gmail.com>2008-12-09 21:14:31 +0000
committerRamiro Polla <ramiro.polla@gmail.com>2008-12-09 21:14:31 +0000
commit23e6a482cc7f3d5859e384ce1be6e6dcb00072c5 (patch)
tree3667062a834103c01f4163a7516a6b4a4ff1635b
parentf27c07273d055fa46e91e3ae3fc886a35356ee50 (diff)
downloaddlfcn-win32-23e6a482cc7f3d5859e384ce1be6e6dcb00072c5.tar.gz
dlfcn-win32-23e6a482cc7f3d5859e384ce1be6e6dcb00072c5.tar.bz2
dlfcn-win32-23e6a482cc7f3d5859e384ce1be6e6dcb00072c5.zip
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.
-rw-r--r--dlfcn.c19
1 files 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 )
105 * the limit. 105 * the limit.
106 */ 106 */
107static char error_buffer[65535]; 107static char error_buffer[65535];
108static int dlerror_was_last_call; 108static char *current_error;
109 109
110static int copy_string( char *dest, int dest_size, const char *src ) 110static int copy_string( char *dest, int dest_size, const char *src )
111{ 111{
@@ -153,6 +153,8 @@ static void save_err_str( const char *str )
153 if( error_buffer[pos-2] == '\r' && error_buffer[pos-1] == '\n' ) 153 if( error_buffer[pos-2] == '\r' && error_buffer[pos-1] == '\n' )
154 error_buffer[pos-2] = '\0'; 154 error_buffer[pos-2] = '\0';
155 } 155 }
156
157 current_error = error_buffer;
156} 158}
157 159
158static void save_err_ptr( const void *ptr ) 160static void save_err_ptr( const void *ptr )
@@ -169,7 +171,7 @@ void *dlopen( const char *file, int mode )
169 HMODULE hModule; 171 HMODULE hModule;
170 UINT uMode; 172 UINT uMode;
171 173
172 dlerror_was_last_call = 0; 174 current_error = NULL;
173 175
174 /* Do not let Windows display the critical-error-handler message box */ 176 /* Do not let Windows display the critical-error-handler message box */
175 uMode = SetErrorMode( SEM_FAILCRITICALERRORS ); 177 uMode = SetErrorMode( SEM_FAILCRITICALERRORS );
@@ -238,7 +240,7 @@ int dlclose( void *handle )
238 HMODULE hModule = (HMODULE) handle; 240 HMODULE hModule = (HMODULE) handle;
239 BOOL ret; 241 BOOL ret;
240 242
241 dlerror_was_last_call = 0; 243 current_error = NULL;
242 244
243 ret = FreeLibrary( hModule ); 245 ret = FreeLibrary( hModule );
244 246
@@ -260,7 +262,7 @@ void *dlsym( void *handle, const char *name )
260{ 262{
261 FARPROC symbol; 263 FARPROC symbol;
262 264
263 dlerror_was_last_call = 0; 265 current_error = NULL;
264 266
265 symbol = GetProcAddress( handle, name ); 267 symbol = GetProcAddress( handle, name );
266 268
@@ -300,13 +302,12 @@ void *dlsym( void *handle, const char *name )
300 302
301char *dlerror( void ) 303char *dlerror( void )
302{ 304{
305 char *error_pointer = current_error;
306
303 /* POSIX says that invoking dlerror( ) a second time, immediately following 307 /* POSIX says that invoking dlerror( ) a second time, immediately following
304 * a prior invocation, shall result in NULL being returned. 308 * a prior invocation, shall result in NULL being returned.
305 */ 309 */
306 if( dlerror_was_last_call ) 310 current_error = NULL;
307 return NULL;
308
309 dlerror_was_last_call = 1;
310 311
311 return error_buffer; 312 return error_pointer;
312} 313}