getpeername() and getsockname() will truncate the result if it is
larger than the passed-in length. Because here always the size of the
`sa` IPv4 union member was passed in, all larger (aka IPv6) results
were truncated. Instead use the size of the `addr` union, which is the
maximum size of all union members.

The bug was introduced in 0b6450c9.

Fixes https://community.openvpn.net/openvpn/ticket/1358

Signed-off-by: corubba <coru...@gmx.de>
---
 src/openvpn/ps.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/openvpn/ps.c b/src/openvpn/ps.c
index 4ca3a129..06bf91a8 100644
--- a/src/openvpn/ps.c
+++ b/src/openvpn/ps.c
@@ -344,8 +344,8 @@ journal_add(const char *journal_dir, struct 
proxy_connection *pc, struct proxy_c
     char *jfn;
     int fd;

-    slen = sizeof(from.addr.sa);
-    dlen = sizeof(to.addr.sa);
+    slen = sizeof(from.addr);
+    dlen = sizeof(to.addr);
     if (!getpeername(pc->sd, (struct sockaddr *) &from.addr.sa, &slen)
         && !getsockname(cp->sd, (struct sockaddr *) &to.addr.sa, &dlen))
     {
--
2.47.1


_______________________________________________
Openvpn-devel mailing list
Openvpn-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/openvpn-devel

Reply via email to