From: Stefan Fritsch Date: Mon, 6 Sep 2010 18:53:38 +0000 (+0000) Subject: - Add another check during ErrorLogFormat parsing X-Git-Tag: 2.3.9~507 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=3ad914e110b4c8ca1111e5f521c8238b61c9fe8c;p=apache - Add another check during ErrorLogFormat parsing - Simplify code (including Ruediger's suggestions) git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@993120 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/CHANGES b/CHANGES index d90f587be8..f48ea7e386 100644 --- a/CHANGES +++ b/CHANGES @@ -5,7 +5,7 @@ Changes with Apache 2.3.9 *) core: Add ErrorLogFormat to allow configuring error log format, including additional information that is logged once per connection or request. Add error log IDs for connections and request to allow correlating error log - lines and the corresponding access log entry. + lines and the corresponding access log entry. [Stefan Fritsch] *) core: Disable sendfile by default. [Stefan Fritsch] diff --git a/server/core.c b/server/core.c index 25f307f5b0..b395238696 100644 --- a/server/core.c +++ b/server/core.c @@ -3272,6 +3272,10 @@ static apr_array_header_t *parse_errorlog_string(apr_pool_t *p, } seen_msg_fmt = 1; } + if (want_msg_fmt && item->flags & AP_ERRORLOG_FLAG_REQUIRED) { + *err = "The '+' flag cannot be used in the main error log format"; + return NULL; + } } if (want_msg_fmt && !seen_msg_fmt) { @@ -3299,7 +3303,7 @@ static const char *set_errorlog_format(cmd_parms *cmd, void *dummy, sizeof(apr_array_header_t *)); } - if (arg2 && *arg2) { + if (*arg2) { apr_array_header_t **e; e = (apr_array_header_t **) apr_array_push(conf->error_log_conn); *e = parse_errorlog_string(cmd->pool, arg2, &err_string, 0); @@ -3311,7 +3315,7 @@ static const char *set_errorlog_format(cmd_parms *cmd, void *dummy, sizeof(apr_array_header_t *)); } - if (arg2 && *arg2) { + if (*arg2) { apr_array_header_t **e; e = (apr_array_header_t **) apr_array_push(conf->error_log_req); *e = parse_errorlog_string(cmd->pool, arg2, &err_string, 0); diff --git a/server/log.c b/server/log.c index 42d711744a..e865628183 100644 --- a/server/log.c +++ b/server/log.c @@ -712,25 +712,24 @@ static int log_apr_status(const ap_errorlog_info *info, const char *arg, char *buf, int buflen) { apr_status_t status = info->status; - int len = 0; + int len; if (!status) return 0; if (status < APR_OS_START_EAIERR) { - len += apr_snprintf(buf + len, buflen - len, - "(%d)", status); + len = apr_snprintf(buf, buflen, "(%d)", status); } else if (status < APR_OS_START_SYSERR) { - len += apr_snprintf(buf + len, buflen - len, - "(EAI %d)", status - APR_OS_START_EAIERR); + len = apr_snprintf(buf, buflen, "(EAI %d)", + status - APR_OS_START_EAIERR); } else if (status < 100000 + APR_OS_START_SYSERR) { - len += apr_snprintf(buf + len, buflen - len, - "(OS %d)", status - APR_OS_START_SYSERR); + len = apr_snprintf(buf, buflen, "(OS %d)", + status - APR_OS_START_SYSERR); } else { - len += apr_snprintf(buf + len, buflen - len, - "(os 0x%08x)", status - APR_OS_START_SYSERR); + len = apr_snprintf(buf, buflen, "(os 0x%08x)", + status - APR_OS_START_SYSERR); } apr_strerror(status, buf + len, buflen - len); len += strlen(buf + len); @@ -813,7 +812,7 @@ static void add_log_id(const conn_rec *c, const request_rec *r) id ^= tmp; } #if APR_HAS_THREADS - if (c) { + { apr_uintptr_t tmp2 = (apr_uintptr_t)c->current_thread; tmp = tmp2; tmp = tmp << 32; @@ -821,14 +820,15 @@ static void add_log_id(const conn_rec *c, const request_rec *r) } #endif - /* - * The apr-util docs wrongly states encoded strings are not 0-terminated. - * Let's be save and allocate an additional byte. - */ - len = 1 + apr_base64_encode_len(sizeof(id)); + len = apr_base64_encode_len(sizeof(id)); encoded = apr_palloc(r ? r->pool : c->pool, len); apr_base64_encode(encoded, (char *)&id, sizeof(id)); - encoded[11] = '\0'; /* omit last char which is always '=' */ + + /* + * Only the first 11 chars are significant, the last (12th) char is + * always '='. + */ + encoded[11] = '\0'; /* need to cast const away */ if (r) {