diff options
author | Silvio <silvio.traversaro@iit.it> | 2017-05-01 11:03:01 +0200 |
---|---|---|
committer | Silvio <silvio.traversaro@iit.it> | 2017-05-01 11:03:01 +0200 |
commit | 5bcd8c53987200107b28a76f4ef38d805e0f6d25 (patch) | |
tree | 0bfa491358554c77d14225b4d441323bbad9a8e0 | |
parent | 18195b170b636b10d30b4073f7bdecf6a331fc9d (diff) | |
download | dlfcn-win32-5bcd8c53987200107b28a76f4ef38d805e0f6d25.tar.gz dlfcn-win32-5bcd8c53987200107b28a76f4ef38d805e0f6d25.tar.bz2 dlfcn-win32-5bcd8c53987200107b28a76f4ef38d805e0f6d25.zip |
Fix bug in dlerror second consecutive call
According to the specs, a second consecutive call
to dlerror should always return NULL .
This was the case in dlfcn-win32 before
https://github.com/dlfcn-win32/dlfcn-win32/pull/20
introduce a regression that caused dlerror to crash
on the second consecutive call.
In this commit the issue is fixed as suggested in
https://github.com/dlfcn-win32/dlfcn-win32/issues/34
and a regression test has been added.
-rw-r--r-- | dlfcn.c | 6 | ||||
-rw-r--r-- | test.c | 15 |
2 files changed, 21 insertions, 0 deletions
@@ -431,6 +431,12 @@ end: | |||
431 | char *dlerror( void ) | 431 | char *dlerror( void ) |
432 | { | 432 | { |
433 | char *error_pointer = dlerror_buffer; | 433 | char *error_pointer = dlerror_buffer; |
434 | |||
435 | /* If this is the second consecutive call to dlerror, return NULL */ | ||
436 | if (current_error == NULL) | ||
437 | { | ||
438 | return NULL; | ||
439 | } | ||
434 | 440 | ||
435 | #ifdef UNICODE | 441 | #ifdef UNICODE |
436 | errno_t err = 0; | 442 | errno_t err = 0; |
@@ -304,6 +304,21 @@ int main() | |||
304 | error = dlerror( ); | 304 | error = dlerror( ); |
305 | printf( "SUCCESS\tCould not get nonexistent symbol from global handle: %s\n", | 305 | printf( "SUCCESS\tCould not get nonexistent symbol from global handle: %s\n", |
306 | error ? error : "" ); | 306 | error ? error : "" ); |
307 | |||
308 | /* Test that the second call to dlerror() returns null as in the specs | ||
309 | See https://github.com/dlfcn-win32/dlfcn-win32/issues/34 */ | ||
310 | error = dlerror( ); | ||
311 | if( error == NULL ) | ||
312 | { | ||
313 | printf( "SUCCESS\tSecond consecutive call to dlerror returned NULL\n"); | ||
314 | } | ||
315 | else | ||
316 | { | ||
317 | printf( "ERROR\tSecond consecutive call to dlerror returned a non-NULL pointer: %p\n", error ); | ||
318 | CLOSE_LIB; | ||
319 | CLOSE_GLOBAL; | ||
320 | RETURN_ERROR; | ||
321 | } | ||
307 | } | 322 | } |
308 | 323 | ||
309 | function = dlsym(global, "fwrite"); | 324 | function = dlsym(global, "fwrite"); |