From: Willy Tarreau Date: Thu, 14 Apr 2022 17:51:02 +0000 (+0200) Subject: MINOR: extcheck: fill in the server's UNIX socket address when known X-Git-Tag: v2.6-dev6~10 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=cef08c20c72b02151a0b64c98cf40a965ce29218;p=thirdparty%2Fhaproxy.git MINOR: extcheck: fill in the server's UNIX socket address when known 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. --- diff --git a/src/extcheck.c b/src/extcheck.c index d82c686d5e..bcc1f8830e 100644 --- a/src/extcheck.c +++ b/src/extcheck.c @@ -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();