[libc-commits] [libc] [libc] Fix size of struct sockaddr_storage (PR #210037)

Pavel Labath via libc-commits libc-commits at lists.llvm.org
Thu Jul 16 04:33:08 PDT 2026


https://github.com/labath created https://github.com/llvm/llvm-project/pull/210037

My cleverness with the union backfired as it introduced an (architecture-specific) padding between before it. Drop the union to avoid that.

This probably wouldn't break much as the structure exists just to allocate space (and this made it larger), but we should fix it nonetheless.

>From dbcff9d75c50dac54fd9fb568cb27c57c5f0c1df Mon Sep 17 00:00:00 2001
From: Pavel Labath <pavel at labath.sk>
Date: Thu, 16 Jul 2026 11:26:16 +0000
Subject: [PATCH] [libc] Fix size of struct sockaddr_storage

My cleverness with the union backfired as it introduced an
(architecture-specific) padding between before it. Drop the union to
avoid that.

This probably wouldn't break much as the structure exists just to
allocate space (and this made it larger), but we should fix it
nonetheless.
---
 libc/include/llvm-libc-types/struct_sockaddr_storage.h   | 6 ++----
 libc/test/src/sys/socket/linux/sockaddr_storage_test.cpp | 1 +
 2 files changed, 3 insertions(+), 4 deletions(-)

diff --git a/libc/include/llvm-libc-types/struct_sockaddr_storage.h b/libc/include/llvm-libc-types/struct_sockaddr_storage.h
index ae59c474a0a8b..c9b19d55ede9b 100644
--- a/libc/include/llvm-libc-types/struct_sockaddr_storage.h
+++ b/libc/include/llvm-libc-types/struct_sockaddr_storage.h
@@ -15,10 +15,8 @@
 // protocol-specific address structures.
 struct __attribute__((may_alias)) sockaddr_storage {
   sa_family_t ss_family;
-  union {
-    char __ss_padding[128 - sizeof(sa_family_t)]; // Ensures size.
-    long __ss_align;                              // Ensures alignment.
-  };
+  char __ss_padding[128 - sizeof(sa_family_t) - sizeof(long)]; // Ensures size.
+  long __ss_align; // Ensures alignment.
 };
 
 #endif // LLVM_LIBC_TYPES_STRUCT_SOCKADDR_STORAGE_H
diff --git a/libc/test/src/sys/socket/linux/sockaddr_storage_test.cpp b/libc/test/src/sys/socket/linux/sockaddr_storage_test.cpp
index 2b7fbcb22aae8..97cfcc9dde0dc 100644
--- a/libc/test/src/sys/socket/linux/sockaddr_storage_test.cpp
+++ b/libc/test/src/sys/socket/linux/sockaddr_storage_test.cpp
@@ -18,6 +18,7 @@ sa_family_t test_sockaddr_aliasing(struct sockaddr_storage *ss,
                                    struct sockaddr_un *sun);
 
 TEST_F(LlvmLibcSockaddrStorageTest, SizeAndAlignment) {
+  static_assert(sizeof(struct sockaddr_storage) == 128);
   // TODO: Add other sockaddr_* types as they are defined.
   static_assert(sizeof(struct sockaddr_un) <= sizeof(struct sockaddr_storage));
   static_assert(alignof(struct sockaddr_un) <=



More information about the libc-commits mailing list