]> git.ipfire.org Git - thirdparty/apache/httpd.git/commitdiff
Do not lose log messages with NULL server_rec when error log provider is used.
authorJan Kaluža <jkaluza@apache.org>
Fri, 8 Nov 2013 11:41:08 +0000 (11:41 +0000)
committerJan Kaluža <jkaluza@apache.org>
Fri, 8 Nov 2013 11:41:08 +0000 (11:41 +0000)
- set stderr_log to NULL after it is redirected to /dev/null
- use log provider of ap_server_conf in log_error_core when no server_rec
  is provided and std_err_log is NULL

git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1539988 13f79535-47bb-0310-9956-ffa450edef68

server/log.c

index a62867e06fc93084a589c51cae2386878acf90b2..a06b9f794dd5d145ae70d0611e568374049cb1ae 100644 (file)
@@ -437,9 +437,12 @@ int ap_open_logs(apr_pool_t *pconf, apr_pool_t *p /* plog */,
 #define NULL_DEVICE "/dev/null"
 #endif
 
-    if (replace_stderr && freopen(NULL_DEVICE, "w", stderr) == NULL) {
-        ap_log_error(APLOG_MARK, APLOG_CRIT, errno, s_main, APLOGNO(00093)
-                     "unable to replace stderr with %s", NULL_DEVICE);
+    if (replace_stderr) {
+        if (freopen(NULL_DEVICE, "w", stderr) == NULL) {
+            ap_log_error(APLOG_MARK, APLOG_CRIT, errno, s_main, APLOGNO(00093)
+                        "unable to replace stderr with %s", NULL_DEVICE);
+        }
+        stderr_log = NULL;
     }
 
     for (virt = s_main->next; virt; virt = virt->next) {
@@ -1034,6 +1037,8 @@ static void log_error_core(const char *file, int line, int module_index,
     const request_rec *rmain = NULL;
     core_server_config *sconf = NULL;
     ap_errorlog_info info;
+    ap_errorlog_provider *errorlog_provider = NULL;
+    void *errorlog_provider_handle = NULL;
 
     /* do we need to log once-per-req or once-per-conn info? */
     int log_conn_info = 0, log_req_info = 0;
@@ -1060,6 +1065,10 @@ static void log_error_core(const char *file, int line, int module_index,
 #endif
 
         logf = stderr_log;
+        if (!logf && ap_server_conf && ap_server_conf->errorlog_provider) {
+            errorlog_provider = ap_server_conf->errorlog_provider;
+            errorlog_provider_handle = ap_server_conf->errorlog_provider_handle;
+        }
     }
     else {
         int configured_level = r ? ap_get_request_module_loglevel(r, module_index)        :
@@ -1078,6 +1087,9 @@ static void log_error_core(const char *file, int line, int module_index,
             logf = s->error_log;
         }
 
+        errorlog_provider = s->errorlog_provider;
+        errorlog_provider_handle = s->errorlog_provider_handle;
+
         /* the faked server_rec from mod_cgid does not have s->module_config */
         if (s->module_config) {
             sconf = ap_get_core_module_config(s->module_config);
@@ -1106,6 +1118,14 @@ static void log_error_core(const char *file, int line, int module_index,
         }
     }
 
+    if (!logf && !errorlog_provider) {
+        /* There is no file to send the log message to (or it is
+         * redirected to /dev/null and therefore any formating done below
+         * would be lost anyway) and there is no log provider available, so
+         * we just return here. */
+        return;
+    }
+
     info.s             = s;
     info.c             = c;
     info.pool          = pool;
@@ -1191,7 +1211,7 @@ static void log_error_core(const char *file, int line, int module_index,
             continue;
         }
 
-        if (logf || (s->errorlog_provider->flags &
+        if (logf || (errorlog_provider->flags &
             AP_ERRORLOG_PROVIDER_ADD_EOL_STR)) {
             /* Truncate for the terminator (as apr_snprintf does) */
             if (len > MAX_STRING_LEN - sizeof(APR_EOL_STR)) {
@@ -1205,8 +1225,8 @@ static void log_error_core(const char *file, int line, int module_index,
             write_logline(errstr, len, logf, level_and_mask);
         }
         else {
-            s->errorlog_provider->writer(&info, s->errorlog_provider_handle,
-                                         errstr, len);
+            errorlog_provider->writer(&info, errorlog_provider_handle,
+                                      errstr, len);
         }
 
         if (done) {