From 9fe5e895a4e308d06ddbcf8b77f9b1b99e05fd23 Mon Sep 17 00:00:00 2001 From: Auke Kok Date: Mon, 2 Feb 2026 15:51:06 -0500 Subject: [PATCH] Account for ipv6 in kernel_get{sock,peer}name compat. These 2 kernel wrapper functions need to be able to properly handle the ipv6 addrlen, instead of returning -EAFNOSUPPORT(-97). Signed-off-by: Auke Kok --- kmod/src/kernelcompat.h | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/kmod/src/kernelcompat.h b/kmod/src/kernelcompat.h index 5564a12a..59fff2fa 100644 --- a/kmod/src/kernelcompat.h +++ b/kmod/src/kernelcompat.h @@ -195,9 +195,11 @@ struct kc_shrinker_wrapper { #include static inline int kc_kernel_getsockname(struct socket *sock, struct sockaddr *addr) { - int addrlen = sizeof(struct sockaddr_in); + int addrlen = sizeof(struct sockaddr_storage); int ret = kernel_getsockname(sock, addr, &addrlen); - if (ret == 0 && addrlen != sizeof(struct sockaddr_in)) + if (ret == 0 && (!( + (addrlen == sizeof(struct sockaddr_in)) || + (addrlen == sizeof(struct sockaddr_in6))))) return -EAFNOSUPPORT; else if (ret < 0) return ret; @@ -206,9 +208,11 @@ static inline int kc_kernel_getsockname(struct socket *sock, struct sockaddr *ad } static inline int kc_kernel_getpeername(struct socket *sock, struct sockaddr *addr) { - int addrlen = sizeof(struct sockaddr_in); + int addrlen = sizeof(struct sockaddr_storage); int ret = kernel_getpeername(sock, addr, &addrlen); - if (ret == 0 && addrlen != sizeof(struct sockaddr_in)) + if (ret == 0 && (!( + (addrlen == sizeof(struct sockaddr_in)) || + (addrlen == sizeof(struct sockaddr_in6))))) return -EAFNOSUPPORT; else if (ret < 0) return ret;