From patchwork Tue May 7 19:54:14 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Florian Weimer X-Patchwork-Id: 1932634 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=redhat.com header.i=@redhat.com header.a=rsa-sha256 header.s=mimecast20190719 header.b=XYmbV1JM; dkim-atps=neutral Authentication-Results: legolas.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=sourceware.org (client-ip=2620:52:3:1:0:246e:9693:128c; helo=server2.sourceware.org; envelope-from=libc-alpha-bounces+incoming=patchwork.ozlabs.org@sourceware.org; receiver=patchwork.ozlabs.org) Received: from server2.sourceware.org (server2.sourceware.org [IPv6:2620:52:3:1:0:246e:9693:128c]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (secp384r1) server-digest SHA384) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4VYprv732Gz1xnS for ; Wed, 8 May 2024 05:54:39 +1000 (AEST) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 1D2C6385828E for ; Tue, 7 May 2024 19:54:38 +0000 (GMT) X-Original-To: libc-alpha@sourceware.org Delivered-To: libc-alpha@sourceware.org Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by sourceware.org (Postfix) with ESMTPS id 0CDBB3858D35 for ; Tue, 7 May 2024 19:54:20 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 0CDBB3858D35 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=redhat.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=redhat.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 0CDBB3858D35 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=170.10.133.124 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1715111662; cv=none; b=PQzvCNBVxr5F+0mRnmXB8Vopm2STpHc7Qzsq9mrGmXN/G5EOdk63IuhmFgyrL5bIHTqPoy+4Ci9KUqYBGZLWNFeUadeFCL04W+5leHCHEpzREid12pyVewLhFEovQB2C86g+3iYzTdVe8ww+9bJ2uO8kfV1OOXSG4D+Yqm8Ng5s= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1715111662; c=relaxed/simple; bh=DUsolDrMgiNbUSBYxuvW7X4vB2ZY92VHMwaKKerfNME=; h=DKIM-Signature:From:To:Subject:Date:Message-ID:MIME-Version; b=aXVBLL6Bv5fW3GebWMc4JNKXGL1nJPkwBqExlsM6jZ68VA3aqH0hRT0YIk4WOwknEE02pnB7myUfZL81nFA2AyBAeVxP83fAAEocqg74AmnGgdvGNaRyUUChusJkeXSHZO1/JDPQmvAZEtw1W3Ym0s/u44iV4wrjk9u2kGVBO6U= ARC-Authentication-Results: i=1; server2.sourceware.org DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1715111659; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type; bh=gDCpH2eZoFANobJlMTUstqGW0xvPlF0BH5yU2cjeEsg=; b=XYmbV1JMKbK5IfLMaysSttytzxQ619/jQdtdPnkmx37TYvjIuK+Jvwtlh8hvFS47r8Weju NlhGztMc4WiOME/v+JY1mJxowRYYdfs7ZahhVlymDnULAW/sbTTuOKEPIf9KHf1WbKCbux lIv5+ZJ4OiBJfm0iYs2rLAiOrWOTYEw= Received: from mimecast-mx02.redhat.com (mx-ext.redhat.com [66.187.233.73]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-250-kXhujKIMO-2FbCqI_ZtyTg-1; Tue, 07 May 2024 15:54:18 -0400 X-MC-Unique: kXhujKIMO-2FbCqI_ZtyTg-1 Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.rdu2.redhat.com [10.11.54.1]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id D837D3803523; Tue, 7 May 2024 19:54:17 +0000 (UTC) Received: from oldenburg.str.redhat.com (unknown [10.39.192.101]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 690773C25; Tue, 7 May 2024 19:54:16 +0000 (UTC) From: Florian Weimer To: libc-alpha@sourceware.org Cc: Jakub Jelinek , Marek Polacek , Sam James Subject: [PATCH v2] socket: Use may_alias on sockaddr structs (bug 19622) Date: Tue, 07 May 2024 21:54:14 +0200 Message-ID: <87h6f95rfd.fsf@oldenburg.str.redhat.com> User-Agent: Gnus/5.13 (Gnus v5.13) MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.4.1 on 10.11.54.1 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com X-Spam-Status: No, score=-11.1 required=5.0 tests=BAYES_00, DKIMWL_WL_HIGH, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H4, RCVD_IN_MSPIKE_WL, SPF_HELO_NONE, SPF_NONE, TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: libc-alpha@sourceware.org X-Mailman-Version: 2.1.30 Precedence: list List-Id: Libc-alpha mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: libc-alpha-bounces+incoming=patchwork.ozlabs.org@sourceware.org This supports common coding paddings. The GCC C front end before version 7 rejects the may_alias attribute on a struct definition if it was not present in a previous forward declaration, so this attribute can only be conditionally applied. This implements the spirit of the change in Austin Group issue 1641. Suggested-by: Marek Polacek Suggested-by: Jakub Jelinek --- v2: Mention Austing Group issue 1641. Correct the GCC version range. The C front end was changed early in the 7 release cycle. bits/socket.h | 4 ++-- inet/netinet/in.h | 8 +++++--- misc/sys/cdefs.h | 9 +++++++++ socket/sys/un.h | 2 +- sysdeps/mach/hurd/bits/socket.h | 4 ++-- sysdeps/unix/sysv/linux/bits/socket.h | 4 ++-- sysdeps/unix/sysv/linux/net/if_packet.h | 2 +- sysdeps/unix/sysv/linux/netash/ash.h | 2 +- sysdeps/unix/sysv/linux/neteconet/ec.h | 2 +- sysdeps/unix/sysv/linux/netiucv/iucv.h | 2 +- 10 files changed, 25 insertions(+), 14 deletions(-) base-commit: 143ef68b2aded7c794956beddad495af8c7d3251 diff --git a/bits/socket.h b/bits/socket.h index 13de124bac..772074d52a 100644 --- a/bits/socket.h +++ b/bits/socket.h @@ -149,7 +149,7 @@ enum __socket_type #include /* Structure describing a generic socket address. */ -struct sockaddr +struct __attribute_struct_may_alias__ sockaddr { __SOCKADDR_COMMON (sa_); /* Common data: address family and length. */ char sa_data[14]; /* Address data. */ @@ -166,7 +166,7 @@ struct sockaddr #define _SS_PADSIZE \ (_SS_SIZE - __SOCKADDR_COMMON_SIZE - sizeof (__ss_aligntype)) -struct sockaddr_storage +struct __attribute_struct_may_alias__ sockaddr_storage { __SOCKADDR_COMMON (ss_); /* Address family, etc. */ char __ss_padding[_SS_PADSIZE]; diff --git a/inet/netinet/in.h b/inet/netinet/in.h index fa57b61079..f684be5beb 100644 --- a/inet/netinet/in.h +++ b/inet/netinet/in.h @@ -244,7 +244,7 @@ extern const struct in6_addr in6addr_loopback; /* ::1 */ /* Structure describing an Internet socket address. */ -struct sockaddr_in +struct __attribute_struct_may_alias__ sockaddr_in { __SOCKADDR_COMMON (sin_); in_port_t sin_port; /* Port number. */ @@ -257,9 +257,11 @@ struct sockaddr_in - sizeof (struct in_addr)]; }; -#if !__USE_KERNEL_IPV6_DEFS +#if __USE_KERNEL_IPV6_DEFS +struct __attribute_struct_may_alias__ sockaddr_in6; +#else /* Ditto, for IPv6. */ -struct sockaddr_in6 +struct __attribute_struct_may_alias__ sockaddr_in6 { __SOCKADDR_COMMON (sin6_); in_port_t sin6_port; /* Transport layer port # */ diff --git a/misc/sys/cdefs.h b/misc/sys/cdefs.h index 2e8279a2c7..32fc70bf0e 100644 --- a/misc/sys/cdefs.h +++ b/misc/sys/cdefs.h @@ -874,4 +874,13 @@ _Static_assert (0, "IEEE 128-bits long double requires redirection on this platf # define __attribute_returns_twice__ /* Ignore. */ #endif +/* Mark struct types as aliasable. Restricted to compilers that + support forward declarations of structs in the presence of the + attribute. */ +#if __GNUC_PREREQ (7, 0) || defined __clang__ +# define __attribute_struct_may_alias__ __attribute__ ((__may_alias__)) +#else +# define __attribute_struct_may_alias__ +#endif + #endif /* sys/cdefs.h */ diff --git a/socket/sys/un.h b/socket/sys/un.h index bf03b7d6ce..ff9cbd6efa 100644 --- a/socket/sys/un.h +++ b/socket/sys/un.h @@ -26,7 +26,7 @@ __BEGIN_DECLS /* Structure describing the address of an AF_LOCAL (aka AF_UNIX) socket. */ -struct sockaddr_un +struct __attribute_struct_may_alias__ sockaddr_un { __SOCKADDR_COMMON (sun_); char sun_path[108]; /* Path name. */ diff --git a/sysdeps/mach/hurd/bits/socket.h b/sysdeps/mach/hurd/bits/socket.h index 3e72f9fa93..b5eeac3731 100644 --- a/sysdeps/mach/hurd/bits/socket.h +++ b/sysdeps/mach/hurd/bits/socket.h @@ -153,7 +153,7 @@ enum __socket_type #include /* Structure describing a generic socket address. */ -struct sockaddr +struct __attribute_struct_may_alias__ sockaddr { __SOCKADDR_COMMON (sa_); /* Common data: address family and length. */ char sa_data[14]; /* Address data. */ @@ -170,7 +170,7 @@ struct sockaddr #define _SS_PADSIZE \ (_SS_SIZE - __SOCKADDR_COMMON_SIZE - sizeof (__ss_aligntype)) -struct sockaddr_storage +struct __attribute_struct_may_alias__ sockaddr_storage { __SOCKADDR_COMMON (ss_); /* Address family, etc. */ char __ss_padding[_SS_PADSIZE]; diff --git a/sysdeps/unix/sysv/linux/bits/socket.h b/sysdeps/unix/sysv/linux/bits/socket.h index 86444f0018..5ab19a8c08 100644 --- a/sysdeps/unix/sysv/linux/bits/socket.h +++ b/sysdeps/unix/sysv/linux/bits/socket.h @@ -181,7 +181,7 @@ typedef __socklen_t socklen_t; #include /* Structure describing a generic socket address. */ -struct sockaddr +struct __attribute_struct_may_alias__ sockaddr { __SOCKADDR_COMMON (sa_); /* Common data: address family and length. */ char sa_data[14]; /* Address data. */ @@ -194,7 +194,7 @@ struct sockaddr #define _SS_PADSIZE \ (_SS_SIZE - __SOCKADDR_COMMON_SIZE - sizeof (__ss_aligntype)) -struct sockaddr_storage +struct __attribute_struct_may_alias__ sockaddr_storage { __SOCKADDR_COMMON (ss_); /* Address family, etc. */ char __ss_padding[_SS_PADSIZE]; diff --git a/sysdeps/unix/sysv/linux/net/if_packet.h b/sysdeps/unix/sysv/linux/net/if_packet.h index 9ffb69b508..c17e1c23c5 100644 --- a/sysdeps/unix/sysv/linux/net/if_packet.h +++ b/sysdeps/unix/sysv/linux/net/if_packet.h @@ -26,7 +26,7 @@ From Linux 2.1 the AF_PACKET interface is preferred and you should consider using it in place of this one. */ -struct sockaddr_pkt +struct __attribute_struct_may_alias__ sockaddr_pkt { __SOCKADDR_COMMON (spkt_); unsigned char spkt_device[14]; diff --git a/sysdeps/unix/sysv/linux/netash/ash.h b/sysdeps/unix/sysv/linux/netash/ash.h index 7d885d17cc..7a6ff50b17 100644 --- a/sysdeps/unix/sysv/linux/netash/ash.h +++ b/sysdeps/unix/sysv/linux/netash/ash.h @@ -22,7 +22,7 @@ #include #include -struct sockaddr_ash +struct __attribute_struct_may_alias__ sockaddr_ash { __SOCKADDR_COMMON (sash_); /* Common data: address family etc. */ int sash_ifindex; /* Interface to use. */ diff --git a/sysdeps/unix/sysv/linux/neteconet/ec.h b/sysdeps/unix/sysv/linux/neteconet/ec.h index b07a107961..f3132f06ff 100644 --- a/sysdeps/unix/sysv/linux/neteconet/ec.h +++ b/sysdeps/unix/sysv/linux/neteconet/ec.h @@ -28,7 +28,7 @@ struct ec_addr unsigned char net; /* Network number. */ }; -struct sockaddr_ec +struct __attribute_struct_may_alias__ sockaddr_ec { __SOCKADDR_COMMON (sec_); unsigned char port; /* Port number. */ diff --git a/sysdeps/unix/sysv/linux/netiucv/iucv.h b/sysdeps/unix/sysv/linux/netiucv/iucv.h index f5fad81751..27151e8bbe 100644 --- a/sysdeps/unix/sysv/linux/netiucv/iucv.h +++ b/sysdeps/unix/sysv/linux/netiucv/iucv.h @@ -23,7 +23,7 @@ __BEGIN_DECLS -struct sockaddr_iucv +struct __attribute_struct_may_alias__ sockaddr_iucv { __SOCKADDR_COMMON (siucv_); unsigned short siucv_port; /* Reserved */