diff --git a/src/extcheck.c b/src/extcheck.c index d82c686d5..bcc1f8830 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();