]> git.ipfire.org Git - thirdparty/apache/httpd.git/commitdiff
Support IPv6-sized client strings in mod_status and mod_echo
authorGraham Leggett <minfrin@apache.org>
Tue, 18 Sep 2018 21:08:10 +0000 (21:08 +0000)
committerGraham Leggett <minfrin@apache.org>
Tue, 18 Sep 2018 21:08:10 +0000 (21:08 +0000)
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
STATUS
include/ap_mmn.h
include/scoreboard.h
modules/echo/mod_echo.c
modules/generators/mod_status.c
modules/lua/lua_request.c
server/scoreboard.c

diff --git a/CHANGES b/CHANGES
index dd28f7fe8d3d43e99ca78f7b1b94a9165757c90b..602ebd4873c20680e792c68f47392b757bff0892 100644 (file)
--- 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 <berni birkenwald de>, Jim Jagielski]
+
   *) http: Enforce consistently no response body with both 204 and 304
      statuses.  [Yann Ylavic]
 
diff --git a/STATUS b/STATUS
index 80a4734c605a376d4540e37d3860b0c0341463d6..93ef15369b49d41a6545dabf3cebabd357b35b4d 100644 (file)
--- 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:
index 17be28e787620bc5536655b60835cce205faa0c2..2167baa0325a7c46d01c6b80368551baea903047 100644 (file)
  *                          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
  *
  */
 
 #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
index 4c846b5f36ba36ca03b0b61bd8211776259d3473..9376da246b0761b9d9fb2c8d534d7f541db34519 100644 (file)
@@ -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 {
index 336f90f3fa534285109c9fd8dca489e75020a7bc..c7f2a19d92be8eb96554eda5f021feb0fed34196 100644 (file)
@@ -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 */
index 67ce7f9d7a6e437ccaea92a57ad10623c7179c9e..5917953090b32cca5c34f17c86f5ce550457c3f2 100644 (file)
@@ -837,7 +837,7 @@ static int status_handler(request_rec *r)
                     ap_rprintf(r,
                                " <i>%s {%s}</i> <i>(%s)</i> <b>[%s]</b><br />\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, "</td><td>%s</td><td>%s</td><td nowrap>%s</td>"
                                   "<td nowrap>%s</td></tr>\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,
index 3e1d2ed804c84e536518fed4f2d243e42427ef78..77a88b437ec1335bfcdaa258c5e7b736ef208889 100644 (file)
@@ -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);
index b25fed00f8f3fd030f7599939a2f296390354e90..23e3d7022ffb92a80bc092d459236ff651426cf8 100644 (file)
@@ -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';