diff options
author | Ramiro Polla <ramiro.polla@gmail.com> | 2008-12-09 21:14:31 +0000 |
---|---|---|
committer | Ramiro Polla <ramiro.polla@gmail.com> | 2008-12-09 21:14:31 +0000 |
commit | 23e6a482cc7f3d5859e384ce1be6e6dcb00072c5 (patch) | |
tree | 3667062a834103c01f4163a7516a6b4a4ff1635b | |
parent | f27c07273d055fa46e91e3ae3fc886a35356ee50 (diff) | |
download | dlfcn-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.c | 19 |
1 files changed, 10 insertions, 9 deletions
@@ -105,7 +105,7 @@ static void global_rem( HMODULE hModule ) | |||
105 | * the limit. | 105 | * the limit. |
106 | */ | 106 | */ |
107 | static char error_buffer[65535]; | 107 | static char error_buffer[65535]; |
108 | static int dlerror_was_last_call; | 108 | static char *current_error; |
109 | 109 | ||
110 | static int copy_string( char *dest, int dest_size, const char *src ) | 110 | static 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 | ||
158 | static void save_err_ptr( const void *ptr ) | 160 | static 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 | ||
301 | char *dlerror( void ) | 303 | char *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 | } |