From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from smtp.gentoo.org (woodpecker.gentoo.org [140.211.166.183]) by sourceware.org (Postfix) with ESMTP id E07983858D1E for ; Tue, 7 May 2024 11:47:57 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org E07983858D1E Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=gentoo.org Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=gentoo.org ARC-Filter: OpenARC Filter v1.0.0 sourceware.org E07983858D1E Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=140.211.166.183 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1715082479; cv=none; b=DNXa3JoWDFlYMVOW/KfX7hnNshpjzLeBAY/proNzwfVekTCMU6TtXS8SAmJHRAt7YqROa4MYqlelwBJ3WnrudYReBxuJ1bg/8qofMNB+2pfz7d73SssELlbL1SMF+O/CNTcqMOsavTMZN47XemNSMWZHGJNOnq1BkoCdUKQ943A= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1715082479; c=relaxed/simple; bh=/g5s/L1UUpkRsKMfwTKfEj2z/0S9HwcJeLZfeER/7do=; h=From:To:Subject:Date:Message-ID:MIME-Version; b=RwpT/Q17hSqHOaoTLw77GdL3aXh/vsjdi7yxU3fKewy+7h9yGS5Y/mIaQBI6/ogvNDjQvdyRXYg/9DeRccnDqB4N0cC49zvOmTG2n1oWFJZMXluqG4H0iez2kyeH+2xYITFMRAiLeQ0+hA3DVdJ8pinkq1g0nbepptB/l0xMTZg= ARC-Authentication-Results: i=1; server2.sourceware.org From: Sam James To: Florian Weimer Cc: libc-alpha@sourceware.org Subject: Re: [PATCH] socket: Use may_alias on sockaddr structs (bug 19622) In-Reply-To: <87v83pam2v.fsf@gentoo.org> (Sam James's message of "Tue, 07 May 2024 12:38:32 +0100") Organization: Gentoo References: <87v83q6kc2.fsf@oldenburg.str.redhat.com> <87v83pam2v.fsf@gentoo.org> Date: Tue, 07 May 2024 12:47:53 +0100 Message-ID: <87pltxalna.fsf@gentoo.org> MIME-Version: 1.0 Content-Type: multipart/signed; boundary="=-=-="; micalg=pgp-sha512; protocol="application/pgp-signature" X-Spam-Status: No, score=-10.6 required=5.0 tests=BAYES_00,GIT_PATCH_0,JMQ_SPF_NEUTRAL,KAM_DMARC_STATUS,RCVD_IN_DNSWL_LOW,RCVD_IN_MSPIKE_H3,RCVD_IN_MSPIKE_WL,SPF_HELO_PASS,SPF_PASS,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 List-Id: --=-=-= Content-Type: text/plain Content-Transfer-Encoding: quoted-printable Sam James writes: > Florian Weimer writes: > >> This supports common coding paddings. GCC before version 8 >> 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. >> >> Tested on i686-linux-gnu, x86_64-linux-gnu. Built with >> build-many-glibcs.py. >> >> Suggested-by: Marek Polacek >> Suggested-by: Jakub Jelinek > > Reviewed-by: Sam James Also, on reflection, consider citing the POSIX change I mentioned on Bugzilla in the commit message too. I think it's useful in making clear this isn't (just) a QoI change? (https://austingroupbugs.net/view.php?id=3D1641) > >> >> --- >> 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(-) >> >> 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 >>=20=20 >> /* 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)) >>=20=20 >> -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 */ >>=20=20 >>=20=20 >> /* 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)]; >> }; >>=20=20 >> -#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..e21a2a7080 100644 >> --- a/misc/sys/cdefs.h >> +++ b/misc/sys/cdefs.h >> @@ -874,4 +874,13 @@ _Static_assert (0, "IEEE 128-bits long double requi= res redirection on this platf >> # define __attribute_returns_twice__ /* Ignore. */ >> #endif >>=20=20 >> +/* Mark struct types as aliasable. Restricted to compilers that >> + support forward declarations of structs in the presence of the >> + attribute. */ >> +#if __GNUC_PREREQ (8, 0) || defined __clang__ >> +# define __attribute_struct_may_alias__ __attribute__ ((__may_alias__)) >> +#else >> +# define __attribute_struct_may_alias__ >> +#endif > > Consider doing '/* Ignore. */' for consistency, even if I think it's a > bit silly. > >> + >> #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 >>=20=20 >> /* 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/so= cket.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 >>=20=20 >> /* 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)) >>=20=20 >> -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/l= inux/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 >>=20=20 >> /* 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)) >>=20=20 >> -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. */ >>=20=20 >> -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/li= nux/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 >>=20=20 >> -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. */ >> }; >>=20=20 >> -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 @@ >>=20=20 >> __BEGIN_DECLS >>=20=20 >> -struct sockaddr_iucv >> +struct __attribute_struct_may_alias__ sockaddr_iucv >> { >> __SOCKADDR_COMMON (siucv_); >> unsigned short siucv_port; /* Reserved */ >> >> base-commit: 4bbca1a44691a6e9adcee5c6798a707b626bc331 --=-=-= Content-Type: application/pgp-signature; name="signature.asc" -----BEGIN PGP SIGNATURE----- iOUEARYKAI0WIQQlpruI3Zt2TGtVQcJzhAn1IN+RkAUCZjoU6l8UgAAAAAAuAChp c3N1ZXItZnByQG5vdGF0aW9ucy5vcGVucGdwLmZpZnRoaG9yc2VtYW4ubmV0MjVB NkJCODhERDlCNzY0QzZCNTU0MUMyNzM4NDA5RjUyMERGOTE5MA8cc2FtQGdlbnRv by5vcmcACgkQc4QJ9SDfkZAOVAD/Q9QzxXnAo1H5oQAwwRFnhsv1T7vc8pyHyfs9 WU1ziUQBANwFFW5a39ynsu0gmQAjY5sP6oipIJrflxzECvhae38D =zfyQ -----END PGP SIGNATURE----- --=-=-=--