From e96f484110252c90c545880bd3fdd63ace7db0ec Mon Sep 17 00:00:00 2001 From: Graham Leggett Date: Tue, 18 Sep 2018 21:08:10 +0000 Subject: [PATCH] Support IPv6-sized client strings in mod_status and mod_echo trunk: http://svn.apache.org/r1837225 http://svn.apache.org/r1837366 2.4.x patch: http://home.apache.org/~jim/patches/client64v2.patch +1: jim, icing (by inspection), minfrin git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/branches/2.4.x@1841259 13f79535-47bb-0310-9956-ffa450edef68 --- CHANGES | 6 ++++++ STATUS | 6 ------ include/ap_mmn.h | 3 ++- include/scoreboard.h | 3 ++- modules/echo/mod_echo.c | 4 ++-- modules/generators/mod_status.c | 4 ++-- modules/lua/lua_request.c | 4 ++++ server/scoreboard.c | 25 +++++++++++++++++-------- 8 files changed, 35 insertions(+), 20 deletions(-) diff --git a/CHANGES b/CHANGES index dd28f7fe8d3..602ebd4873c 100644 --- a/CHANGES +++ b/CHANGES @@ -3,6 +3,12 @@ Changes with Apache 2.4.36 Changes with Apache 2.4.35 + *) mod_status, mod_echo: Fix the display of client addresses. + They were truncated to 31 characters which is not enough for IPv6 addresses. + This is done by deprecating the use of the 'client' field and using + the new 'client64' field in worker_score. + PR 54848 [Bernhard Schmidt , Jim Jagielski] + *) http: Enforce consistently no response body with both 204 and 304 statuses. [Yann Ylavic] diff --git a/STATUS b/STATUS index 80a4734c605..93ef15369b4 100644 --- a/STATUS +++ b/STATUS @@ -124,12 +124,6 @@ RELEASE SHOWSTOPPERS: PATCHES ACCEPTED TO BACKPORT FROM TRUNK: [ start all new proposals below, under PATCHES PROPOSED. ] - *) Support IPv6-sized client strings in mod_status and mod_echo - trunk: http://svn.apache.org/r1837225 - http://svn.apache.org/r1837366 - 2.4.x patch: http://home.apache.org/~jim/patches/client64v2.patch - +1: jim, icing (by inspection), minfrin - PATCHES PROPOSED TO BACKPORT FROM TRUNK: diff --git a/include/ap_mmn.h b/include/ap_mmn.h index 17be28e7876..2167baa0325 100644 --- a/include/ap_mmn.h +++ b/include/ap_mmn.h @@ -522,6 +522,7 @@ * scoreboard.h * 20120211.82 (2.4.35-dev) Add optional function declaration for * ap_proxy_balancer_get_best_worker to mod_proxy.h. + * 20120211.83 (2.4.35-dev) Add client64 field to worker_score struct * */ @@ -530,7 +531,7 @@ #ifndef MODULE_MAGIC_NUMBER_MAJOR #define MODULE_MAGIC_NUMBER_MAJOR 20120211 #endif -#define MODULE_MAGIC_NUMBER_MINOR 82 /* 0...n */ +#define MODULE_MAGIC_NUMBER_MINOR 83 /* 0...n */ /** * Determine if the server's current MODULE_MAGIC_NUMBER is at least a diff --git a/include/scoreboard.h b/include/scoreboard.h index 4c846b5f36b..9376da246b0 100644 --- a/include/scoreboard.h +++ b/include/scoreboard.h @@ -112,11 +112,12 @@ struct worker_score { #ifdef HAVE_TIMES struct tms times; #endif - char client[32]; /* Keep 'em small... */ + char client[32]; /* DEPRECATED: Keep 'em small... */ char request[64]; /* We just want an idea... */ char vhost[32]; /* What virtual host is being accessed? */ char protocol[16]; /* What protocol is used on the connection? */ apr_time_t duration; + char client64[64]; }; typedef struct { diff --git a/modules/echo/mod_echo.c b/modules/echo/mod_echo.c index 336f90f3fa5..c7f2a19d92b 100644 --- a/modules/echo/mod_echo.c +++ b/modules/echo/mod_echo.c @@ -108,10 +108,10 @@ static int update_echo_child_status(ap_sb_handle_t *sbh, /* initial pass only, please - in the name of efficiency */ if (c) { - apr_cpystrn(ws->client, + apr_cpystrn(ws->client64, ap_get_remote_host(c, c->base_server->lookup_defaults, REMOTE_NOLOOKUP, NULL), - sizeof(ws->client)); + sizeof(ws->client64)); apr_cpystrn(ws->vhost, c->base_server->server_hostname, sizeof(ws->vhost)); /* Deliberate trailing space - filling in string on WRITE passes */ diff --git a/modules/generators/mod_status.c b/modules/generators/mod_status.c index 67ce7f9d7a6..5917953090b 100644 --- a/modules/generators/mod_status.c +++ b/modules/generators/mod_status.c @@ -837,7 +837,7 @@ static int status_handler(request_rec *r) ap_rprintf(r, " %s {%s} (%s) [%s]
\n\n", ap_escape_html(r->pool, - ws_record->client), + ws_record->client64), ap_escape_html(r->pool, ap_escape_logitem(r->pool, ws_record->request)), @@ -924,7 +924,7 @@ static int status_handler(request_rec *r) ap_rprintf(r, "%s%s%s" "%s\n\n", ap_escape_html(r->pool, - ws_record->client), + ws_record->client64), ap_escape_html(r->pool, ws_record->protocol), ap_escape_html(r->pool, diff --git a/modules/lua/lua_request.c b/modules/lua/lua_request.c index 3e1d2ed804c..77a88b437ec 100644 --- a/modules/lua/lua_request.c +++ b/modules/lua/lua_request.c @@ -1275,6 +1275,10 @@ static int lua_ap_scoreboard_worker(lua_State *L) lua_pushstring(L, ws_record->client); lua_settable(L, -3); + lua_pushstring(L, "client64"); + lua_pushstring(L, ws_record->client64); + lua_settable(L, -3); + lua_pushstring(L, "conn_bytes"); lua_pushnumber(L, (lua_Number) ws_record->conn_bytes); lua_settable(L, -3); diff --git a/server/scoreboard.c b/server/scoreboard.c index b25fed00f8f..23e3d7022ff 100644 --- a/server/scoreboard.c +++ b/server/scoreboard.c @@ -517,17 +517,25 @@ static int update_child_status_internal(int child_num, } if (r && r->useragent_ip) { - if (!(val = ap_get_useragent_host(r, REMOTE_NOLOOKUP, NULL))) - apr_cpystrn(ws->client, r->useragent_ip, sizeof(ws->client)); - else - apr_cpystrn(ws->client, val, sizeof(ws->client)); + if (!(val = ap_get_useragent_host(r, REMOTE_NOLOOKUP, NULL))) { + apr_cpystrn(ws->client, r->useragent_ip, sizeof(ws->client)); /* DEPRECATE */ + apr_cpystrn(ws->client64, r->useragent_ip, sizeof(ws->client64)); + } + else { + apr_cpystrn(ws->client, val, sizeof(ws->client)); /* DEPRECATE */ + apr_cpystrn(ws->client64, val, sizeof(ws->client64)); + } } else if (c) { if (!(val = ap_get_remote_host(c, c->base_server->lookup_defaults, - REMOTE_NOLOOKUP, NULL))) - apr_cpystrn(ws->client, c->client_ip, sizeof(ws->client)); - else - apr_cpystrn(ws->client, val, sizeof(ws->client)); + REMOTE_NOLOOKUP, NULL))) { + apr_cpystrn(ws->client, c->client_ip, sizeof(ws->client)); /* DEPRECATE */ + apr_cpystrn(ws->client64, c->client_ip, sizeof(ws->client64)); + } + else { + apr_cpystrn(ws->client, val, sizeof(ws->client)); /* DEPRECATE */ + apr_cpystrn(ws->client64, val, sizeof(ws->client64)); + } } if (s) { @@ -673,6 +681,7 @@ AP_DECLARE(void) ap_copy_scoreboard_worker(worker_score *dest, /* For extra safety, NUL-terminate the strings returned, though it * should be true those last bytes are always zero anyway. */ dest->client[sizeof(dest->client) - 1] = '\0'; + dest->client64[sizeof(dest->client64) - 1] = '\0'; dest->request[sizeof(dest->request) - 1] = '\0'; dest->vhost[sizeof(dest->vhost) - 1] = '\0'; dest->protocol[sizeof(dest->protocol) - 1] = '\0'; -- 2.47.3