]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
MINOR: extcheck: fill in the server's UNIX socket address when known
authorWilly Tarreau <w@1wt.eu>
Thu, 14 Apr 2022 17:51:02 +0000 (19:51 +0200)
committerWilly Tarreau <w@1wt.eu>
Thu, 14 Apr 2022 17:56:32 +0000 (19:56 +0200)
While it's often a pain to try to figure a UNIX socket address, the
server ones are reliable and may be emitted in the check provided
they are retrieved in time. We cannot rely on addr_to_str() because
it only reports "unix" since it may be used to log client addresses
or listener addresses (which are renamed).

The address length was extended to 256 chars to deal with long paths
as previously it was limited to INET6_ADDRSTRLEN+1.

This addresses github issue #101. There's no point backporting this,
external checks are almost never used.

src/extcheck.c

index d82c686d5ecfaf480e85e7ae511907a59dc9224b..bcc1f8830e19966ba42ac183fbced8035a6bcf05 100644 (file)
@@ -56,7 +56,7 @@ struct extcheck_env {
                                                   * such environment variables are not updatable. */
 #define EXTCHK_SIZE_ULONG     20                 /* max string length for an unsigned long value */
 #define EXTCHK_SIZE_UINT      11                 /* max string length for an unsigned int value */
-#define EXTCHK_SIZE_ADDR      INET6_ADDRSTRLEN+1 /* max string length for an address */
+#define EXTCHK_SIZE_ADDR      256                /* max string length for an IPv4/IPv6/UNIX address */
 
 /* external checks environment variables */
 enum {
@@ -415,12 +415,18 @@ static int connect_proc_chk(struct task *t)
                /* Update some environment variables and command args: curconn, server addr and server port */
                EXTCHK_SETENV(check, EXTCHK_HAPROXY_SERVER_CURCONN, ultoa_r(s->cur_sess, buf, sizeof(buf)), fail);
 
-               addr_to_str(&s->addr, check->argv[3], EXTCHK_SIZE_ADDR);
-               EXTCHK_SETENV(check, EXTCHK_HAPROXY_SERVER_ADDR, check->argv[3], fail);
+               if (s->addr.ss_family == AF_UNIX) {
+                       const struct sockaddr_un *un = (struct sockaddr_un *)&s->addr;
+                       strlcpy2(check->argv[3], un->sun_path, EXTCHK_SIZE_ADDR);
+                       memcpy(check->argv[4], "NOT_USED", 9);
+               } else {
+                       addr_to_str(&s->addr, check->argv[3], EXTCHK_SIZE_ADDR);
+                       *check->argv[4] = 0; // just in case the address family changed
+                       if (s->addr.ss_family == AF_INET || s->addr.ss_family == AF_INET6)
+                               snprintf(check->argv[4], EXTCHK_SIZE_UINT, "%u", s->svc_port);
+               }
 
-               *check->argv[4] = 0;
-               if (s->addr.ss_family == AF_INET || s->addr.ss_family == AF_INET6)
-                       snprintf(check->argv[4], EXTCHK_SIZE_UINT, "%u", s->svc_port);
+               EXTCHK_SETENV(check, EXTCHK_HAPROXY_SERVER_ADDR, check->argv[3], fail);
                EXTCHK_SETENV(check, EXTCHK_HAPROXY_SERVER_PORT, check->argv[4], fail);
 
                haproxy_unblock_signals();