From: Jim Jagielski Date: Mon, 11 Mar 2013 16:33:22 +0000 (+0000) Subject: Merge r1429582 from trunk: X-Git-Tag: 2.4.5~496 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=99dfef5dc9ec5f9da030055dcfc265db157642e9;p=apache Merge r1429582 from trunk: According to my testing, one special case of 'log_xlate_error', i.e. EES_INCOMPLETE_CHAR, is 13x (!!!) faster with the use 'ap_bin2hex' instead of apr_snprintf(..., "%02X" + srlen for each character. Output is *not* exactly the same. It was uppercase, now it is lowercase. It is just for logging, so I don't think it is an issue. Should it be, a call to ap_strtoupper can be added. So sad it is just for logging in case of error... no real speedup to be expected in real life . Submitted by: jailletc36 Reviewed/backported by: jim git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/branches/2.4.x@1455221 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/STATUS b/STATUS index acce76c512..a004c46941 100644 --- a/STATUS +++ b/STATUS @@ -117,12 +117,6 @@ PATCHES ACCEPTED TO BACKPORT FROM TRUNK: 2.4.x cumulative patch: http://people.apache.org/~jailletc36/backport5.patch (minus CHANGES for 1448171) +1: jailletc36, igalic, jim - * mod_charset_lite: clean up and speed up special case of logging function by x13 using ap_bin2hex intoduced in 2.4.4 - It will be in lowercase instead of uppercase, but it is only for logging. I don't think this is a real issue. - trunk patch: http://svn.apache.org/viewvc?view=revision&revision=1429582 - 2.4.x patch: trunk patch applies. - +1: jailletc36, humbedooh, jim - * mod_log_forensic: Speed up logging of characters that need to be escaped. PR 50919 trunk patch: http://svn.apache.org/viewvc?view=revision&revision=1429564 2.4.x patch: trunk patch applies. diff --git a/modules/filters/mod_charset_lite.c b/modules/filters/mod_charset_lite.c index 39ab18fc1f..2d3d143996 100644 --- a/modules/filters/mod_charset_lite.c +++ b/modules/filters/mod_charset_lite.c @@ -474,7 +474,7 @@ static void log_xlate_error(ap_filter_t *f, apr_status_t rv) charset_filter_ctx_t *ctx = f->ctx; const char *msg; char msgbuf[100]; - int cur; + int len; switch(ctx->ees) { case EES_LIMIT: @@ -492,12 +492,14 @@ static void log_xlate_error(ap_filter_t *f, apr_status_t rv) case EES_INCOMPLETE_CHAR: rv = 0; strcpy(msgbuf, APLOGNO(02196) "xlate filter - incomplete char at end of input - "); - cur = 0; - while ((apr_size_t)cur < ctx->saved) { - apr_snprintf(msgbuf + strlen(msgbuf), sizeof(msgbuf) - strlen(msgbuf), - "%02X", (unsigned)ctx->buf[cur]); - ++cur; - } + len = ctx->saved; + + /* We must ensure not to process more than what would fit in the + * remaining of the destination buffer, including terminating NULL */ + if (len > (sizeof(msgbuf) - strlen(msgbuf) - 1) / 2) + len = (sizeof(msgbuf) - strlen(msgbuf) - 1) / 2; + + ap_bin2hex(ctx->buf, len, msgbuf + strlen(msgbuf)); msg = msgbuf; break; case EES_DOWNSTREAM: