]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
BUG/MINOR: log: fix outgoing abns address family
authorAurelien DARRAGON <adarragon@haproxy.com>
Fri, 21 Feb 2025 10:03:39 +0000 (11:03 +0100)
committerAurelien DARRAGON <adarragon@haproxy.com>
Fri, 21 Feb 2025 10:22:28 +0000 (11:22 +0100)
While reviewing the code in an attempt to fix GH #2875, I stumbled
on another case similar to aac570c ("BUG/MEDIUM: uxst: fix outgoing
abns address family in connect()") that caused abns(z) addresses to
fail when used as log targets.

The underlying cause is the same as aac570c, which is the rework of the
unix socket families in order to support custom addresses for different
adressing schemes, where a real_family() was overlooked before passing
a haproxy-internal address struct to socket-oriented syscall.

To fix the issue, we first copy the target's addr, and then leverage
real_family() to set the proper low-level address family that is passed
to sendmsg() syscall.

It should be backported in 3.1

src/log.c

index 90b5645cb2e60c5c5407f80895accaf027d56a33..e7c13d5b30fc1cdea3c7948adb5d66dd4e784d62 100644 (file)
--- a/src/log.c
+++ b/src/log.c
@@ -2785,6 +2785,7 @@ static inline void __do_send_log(struct log_target *target, struct log_header hd
                sent = fd_write_frag_line(*plogfd, maxlen, msg_header, nbelem, &msg, 1, 1);
        }
        else {
+               struct sockaddr_storage addr;
                int i = 0;
                int totlen = maxlen - 1; /* save space for the final '\n' */
 
@@ -2810,7 +2811,9 @@ static inline void __do_send_log(struct log_target *target, struct log_header hd
                i++;
 
                msghdr.msg_iovlen = i;
-               msghdr.msg_name = (struct sockaddr *)target->addr;
+               addr = *target->addr;
+               addr.ss_family = real_family(target->addr->ss_family);
+               msghdr.msg_name = (struct sockaddr *)&addr;
                msghdr.msg_namelen = get_addr_len(target->addr);
 
                sent = sendmsg(*plogfd, &msghdr, MSG_DONTWAIT | MSG_NOSIGNAL);