From mboxrd@z Thu Jan 1 00:00:00 1970 X-Msuck: nntp://news.gmane.org/gmane.linux.lib.musl.general/10063 Path: news.gmane.org!not-for-mail From: William Ahern Newsgroups: gmane.linux.lib.musl.general Subject: Re: sockaddr_storage and GCC 6.1 Date: Thu, 26 May 2016 13:21:39 -0700 Message-ID: <20160526202139.GA24268@wilbur.25thandClement.com> Reply-To: musl@lists.openwall.com NNTP-Posting-Host: plane.gmane.org Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="d4sdaDxiYrLx6gQC" X-Trace: ger.gmane.org 1464294128 22643 80.91.229.3 (26 May 2016 20:22:08 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Thu, 26 May 2016 20:22:08 +0000 (UTC) To: musl@lists.openwall.com Original-X-From: musl-return-10076-gllmg-musl=m.gmane.org@lists.openwall.com Thu May 26 22:22:07 2016 Return-path: Envelope-to: gllmg-musl@m.gmane.org Original-Received: from mother.openwall.net ([195.42.179.200]) by plane.gmane.org with smtp (Exim 4.69) (envelope-from ) id 1b61n8-0003wD-CX for gllmg-musl@m.gmane.org; Thu, 26 May 2016 22:22:02 +0200 Original-Received: (qmail 31917 invoked by uid 550); 26 May 2016 20:22:00 -0000 Mailing-List: contact musl-help@lists.openwall.com; run by ezmlm Precedence: bulk List-Post: List-Help: List-Unsubscribe: List-Subscribe: List-ID: Original-Received: (qmail 30719 invoked from network); 26 May 2016 20:21:53 -0000 DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=25thandClement.com; h=date :from:to:subject:message-id:mime-version:content-type; s= jan2009; bh=MaHDcA8HnEdQ6trTiUSwwayUjnA=; b=ks3EQWsh68LWxvKXYyQX hIWzUaYtz8wdn2Dmug5V5BoEgURly9C5Dlop0wtHc15ezMwx+xx1ppdQ1c0mFQjr BtwMqCbgfEDI2LJRdjWOEfwLsgiTSu4DeCbNpeIVXBpzTe/4t2nWxhN72+baS5Ou baEw4m+0jkojH4QD7UwU2f8= DomainKey-Signature: a=rsa-sha1; c=nofws; d=25thandClement.com; h=date :from:to:subject:message-id:mime-version:content-type; q=dns; s= jan2009; b=PKYxBsMmfFqKIY0HespuhylrsAfRNeOJc0khu6hjKtDWrYZudhTgQ YrYBFQX/a2cxniL9wNvpIVt9ZFNYIoO9QkRK5Xgfj2c4rfj6lak5D5LwNMwXSOb/ aimI6VO3nRmORNQWXowU/HoFcrOVKaO/C8fFbiOlC/8pM5OcLtuZ/o= Content-Disposition: inline User-Agent: Mutt/1.5.23 (2014-03-12) Xref: news.gmane.org gmane.linux.lib.musl.general:10063 Archived-At: --d4sdaDxiYrLx6gQC Content-Type: text/plain; charset=us-ascii Content-Disposition: inline I forgot to mention that I'm not subscribed to the list. I was able to build GCC 6.1 last night, but on my OS X desktop. My Alpine Linux development environment doesn't have the disk space. My test code manually reproduced the structure definitions. Both of the patches proposed appear to work, at least with strict aliasing disabled. Attached is the source code I used to verify. Here's the output of `make test`. == ss-darwin-no-strict-aliasing == .ss_len: 0,1 .ss_family: 1,2 .__ss_pad1: 2,8 .__ss_align: 8,16 .__ss_pad2: 16,128 .sin_family: 1,2 .sin_port: 2,4 .sin_addr: 4,8 0x7f000001 (OKAY) == ss-darwin-strict-aliasing == .ss_len: 0,1 .ss_family: 1,2 .__ss_pad1: 2,8 .__ss_align: 8,16 .__ss_pad2: 16,128 .sin_family: 1,2 .sin_port: 2,4 .sin_addr: 4,8 0x00000000 (FAIL) == ss-musl0-no-strict-aliasing == .ss_family: 0,2 .__ss_align: 8,16 .__ss_padding: 16,128 .sin_family: 0,2 .sin_port: 2,4 .sin_addr: 4,8 0x00000000 (FAIL) == ss-musl0-strict-aliasing == .ss_family: 0,2 .__ss_align: 8,16 .__ss_padding: 16,128 .sin_family: 0,2 .sin_port: 2,4 .sin_addr: 4,8 0x00000000 (FAIL) == ss-musl1-no-strict-aliasing == .ss_family: 0,2 .__ss_family_pad: 2,8 .__ss_align: 8,16 .__ss_padding: 16,128 .sin_family: 0,2 .sin_port: 2,4 .sin_addr: 4,8 0x7f000001 (OKAY) == ss-musl1-strict-aliasing == .ss_family: 0,2 .__ss_family_pad: 2,8 .__ss_align: 8,16 .__ss_padding: 16,128 .sin_family: 0,2 .sin_port: 2,4 .sin_addr: 4,8 0x00000000 (FAIL) == ss-musl2-no-strict-aliasing == .ss_family: 0,2 .__ss_padding: 2,120 .__ss_align: 120,128 .sin_family: 0,2 .sin_port: 2,4 .sin_addr: 4,8 0x7f000001 (OKAY) == ss-musl2-strict-aliasing == .ss_family: 0,2 .__ss_padding: 2,120 .__ss_align: 120,128 .sin_family: 0,2 .sin_port: 2,4 .sin_addr: 4,8 0x00000000 (FAIL) --d4sdaDxiYrLx6gQC Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=Makefile CC=/usr/local/gcc6/bin/gcc CPPFLAGS= CFLAGS=-O2 -Wall -Wextra -std=c11 all: ss-darwin-strict-aliasing ss-darwin-no-strict-aliasing all: ss-musl0-strict-aliasing ss-musl0-no-strict-aliasing all: ss-musl1-strict-aliasing ss-musl1-no-strict-aliasing all: ss-musl2-strict-aliasing ss-musl2-no-strict-aliasing ss-darwin-strict-aliasing ss-darwin-no-strict-aliasing: ss.c $(CC) -o $@ ss.c $(CPPFLAGS) $(CFLAGS) -f$(@:ss-darwin-%=%) ss-musl0-strict-aliasing ss-musl0-no-strict-aliasing: ss.c $(CC) -o $@ ss.c $(CPPFLAGS) -DMUSL_PATCH=0 $(CFLAGS) -f$(@:ss-musl0-%=%) ss-musl1-strict-aliasing ss-musl1-no-strict-aliasing: ss.c $(CC) -o $@ ss.c $(CPPFLAGS) -DMUSL_PATCH=1 $(CFLAGS) -f$(@:ss-musl1-%=%) ss-musl2-strict-aliasing ss-musl2-no-strict-aliasing: ss.c $(CC) -o $@ ss.c $(CPPFLAGS) -DMUSL_PATCH=2 $(CFLAGS) -f$(@:ss-musl2-%=%) test: all @for T in ss-darwin* ss-musl*; do \ printf "== %s ==\n" "$${T}"; \ "./$${T}"; \ printf "\n"; \ done clean: rm -f -- ./ss-darwin* ./ss-musl* --d4sdaDxiYrLx6gQC Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename="ss.c" #include #include #include #include #include #include #define vectorof(T, m) offsetof(T, m), (offsetof(T, m) + sizeof (*(T *)0).m) #define ss_vectorof(m) vectorof(struct sockaddr_storage, m) #define sin_vectorof(m) vectorof(struct sockaddr_in, m) #if !defined MUSL_PATCH #include #include #include #if !__APPLE__ #error exected Darwin #endif static void ss_layout(void) { printf(".ss_len: %zu,%zu\n", ss_vectorof(ss_len)); printf(".ss_family: %zu,%zu\n", ss_vectorof(ss_family)); printf(".__ss_pad1: %zu,%zu\n", ss_vectorof(__ss_pad1)); printf(".__ss_align: %zu,%zu\n", ss_vectorof(__ss_align)); printf(".__ss_pad2: %zu,%zu\n", ss_vectorof(__ss_pad2)); } #else typedef unsigned socklen_t; typedef unsigned short sa_family_t; #if MUSL_PATCH == 2 struct sockaddr_storage { sa_family_t ss_family; char __ss_padding[128-sizeof(long)-sizeof(sa_family_t)]; unsigned long __ss_align; }; static void ss_layout(void) { printf(".ss_family: %zu,%zu\n", ss_vectorof(ss_family)); printf(".__ss_padding: %zu,%zu\n", ss_vectorof(__ss_padding)); printf(".__ss_align: %zu,%zu\n", ss_vectorof(__ss_align)); } #elif MUSL_PATCH == 1 struct sockaddr_storage { sa_family_t ss_family; char __ss_family_pad[sizeof(long)-sizeof(sa_family_t)]; unsigned long __ss_align; char __ss_padding[128-2*sizeof(unsigned long)]; }; static void ss_layout(void) { printf(".ss_family: %zu,%zu\n", ss_vectorof(ss_family)); printf(".__ss_family_pad: %zu,%zu\n", ss_vectorof(__ss_family_pad)); printf(".__ss_align: %zu,%zu\n", ss_vectorof(__ss_align)); printf(".__ss_padding: %zu,%zu\n", ss_vectorof(__ss_padding)); } #else struct sockaddr_storage { sa_family_t ss_family; unsigned long __ss_align; char __ss_padding[128-2*sizeof(unsigned long)]; }; static void ss_layout(void) { printf(".ss_family: %zu,%zu\n", ss_vectorof(ss_family)); printf(".__ss_align: %zu,%zu\n", ss_vectorof(__ss_align)); printf(".__ss_padding: %zu,%zu\n", ss_vectorof(__ss_padding)); } #endif typedef uint16_t in_port_t; typedef uint32_t in_addr_t; struct in_addr { in_addr_t s_addr; }; struct sockaddr_in { sa_family_t sin_family; in_port_t sin_port; struct in_addr sin_addr; uint8_t sin_zero[8]; }; #define INADDR_LOOPBACK UINT32_C(0x7f000001) #define AF_INET 2 #undef htonl #undef htons #undef ntohl #undef ntohs uint32_t htonl(uint32_t); uint16_t htons(uint16_t); uint32_t ntohl(uint32_t); uint16_t ntohs(uint16_t); #endif static void sin_layout(void) { printf(".sin_family: %zu,%zu\n", sin_vectorof(sin_family)); printf(".sin_port: %zu,%zu\n", sin_vectorof(sin_port)); printf(".sin_addr: %zu,%zu\n", sin_vectorof(sin_addr)); } struct dbg_listener { struct sockaddr_storage addr; }; int main(void) { struct dbg_listener *l; struct sockaddr_storage ss, *ss2, ss3; ss_layout(); sin_layout(); memset(&ss3, 0, sizeof ss3); ss3.ss_family = AF_INET; ((struct sockaddr_in *)&ss3)->sin_addr.s_addr = htonl(INADDR_LOOPBACK); ss2 = &ss3; ss = *ss2; l = calloc(1, sizeof *l); l->addr = ss; printf("0x%.8x (%s)\n", ntohl(((struct sockaddr_in *)(&l->addr))->sin_addr.s_addr), (ntohl(((struct sockaddr_in *)(&l->addr))->sin_addr.s_addr) == INADDR_LOOPBACK)? "OKAY" : "FAIL"); return 0; } --d4sdaDxiYrLx6gQC--