Fix error logging for dynamically-loaded modules. Bug 2507
authorJeremy Harris <jgh146exb@wizmail.org>
Wed, 8 Jan 2020 10:49:31 +0000 (10:49 +0000)
committerJeremy Harris <jgh146exb@wizmail.org>
Wed, 8 Jan 2020 10:52:37 +0000 (10:52 +0000)
doc/doc-txt/ChangeLog
src/src/drtables.c
src/src/exim.c

index ce225e9492788b5396d03bee2d0f350d57e50aab..2b5b592c5a5de145cb27a43fe7eaea687ef72dec 100644 (file)
@@ -81,7 +81,11 @@ WB/01 SPF: DNS lookups for the obsolete SPF RR type done by the libspf2 library
       are now specifically given a NO_DATA response without hitting the system
       resolver.  The library goes on to do the now-standard TXT lookup.
       Use of dnsdb lookups is not affected.
-      
+
+JH/19 Bug 2507: Modules: on handling a dynamic-module (lookups) open failure,
+      only retrieve the errormessage once.  Previously two calls to dlerror()
+      were used, and the second one (for mainlog/paniclog) retrieved null
+      information.
 
 
 Exim version 4.93
index 578ddf3708e787d632dcbc28fa798e0d7abffd8b..558359032170e8a28dc96285a505dea757dc1b0e 100644 (file)
@@ -753,9 +753,10 @@ else
 
       if (!(dl = dlopen(CS big_buffer, RTLD_NOW)))
        {
-       fprintf(stderr, "Error loading %s: %s\n", name, dlerror());
+       errormessage = dlerror();
+       fprintf(stderr, "Error loading %s: %s\n", name, errormessage);
        moduleerrors++;
-       log_write(0, LOG_MAIN|LOG_PANIC, "Error loading lookup module %s: %s\n", name, dlerror());
+       log_write(0, LOG_MAIN|LOG_PANIC, "Error loading lookup module %s: %s\n", name, errormessage);
        continue;
        }
 
index af4b525591c6140988e9773107d24bc404656c69..92f5623d23af304dbd3ee9c4de7c59fc7f7a1c70 100644 (file)
@@ -1265,9 +1265,9 @@ void *dlhandle;
 void *dlhandle_curses = dlopen("libcurses." DYNLIB_FN_EXT, RTLD_GLOBAL|RTLD_LAZY);
 
 dlhandle = dlopen("libreadline." DYNLIB_FN_EXT, RTLD_GLOBAL|RTLD_NOW);
-if (dlhandle_curses != NULL) dlclose(dlhandle_curses);
+if (dlhandle_curses) dlclose(dlhandle_curses);
 
-if (dlhandle != NULL)
+if (dlhandle)
   {
   /* Checked manual pages; at least in GNU Readline 6.1, the prototypes are:
    *   char * readline (const char *prompt);
@@ -1277,9 +1277,7 @@ if (dlhandle != NULL)
   *fn_addhist_ptr = (void(*)(const char*))dlsym(dlhandle, "add_history");
   }
 else
-  {
   DEBUG(D_any) debug_printf("failed to load readline: %s\n", dlerror());
-  }
 
 return dlhandle;
 }