From: Willy Tarreau Date: Sun, 16 Jun 2019 16:16:33 +0000 (+0200) Subject: BUILD: tools: work around an internal compiler bug in gcc-3.4 X-Git-Tag: v2.0.0~5 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=8daa920ae446078b38371d5cfbfd22426ad30c32;p=thirdparty%2Fhaproxy.git BUILD: tools: work around an internal compiler bug in gcc-3.4 gcc-3.4 fails to compile standard.c : src/standard.c: In function `str2sa_range': src/standard.c:1034: error: unrecognizable insn: (insn 582 581 583 37 src/standard.c:949 (set (reg/f:SI 262) (high:SI (const:SI (plus:SI (symbol_ref:SI ("*ss.4") [flags 0x22] ) (const_int 2 [0x2]))))) -1 (nil) (nil)) src/standard.c:1034: internal compiler error: in extract_insn, at recog.c:2083 The workaround is explained here : https://gcc.gnu.org/bugzilla/show_bug.cgi?id=21613 It only requires creating a local variable containing the result of the cast, which is totally harmless, so let's do it. --- diff --git a/src/standard.c b/src/standard.c index 3651f5e35d..2f205f7483 100644 --- a/src/standard.c +++ b/src/standard.c @@ -928,6 +928,7 @@ struct sockaddr_storage *str2sa_range(const char *str, int *port, int *low, int ss.ss_family = AF_UNSPEC; } else if (ss.ss_family == AF_UNIX) { + struct sockaddr_un *un = (struct sockaddr_un *)&ss; int prefix_path_len; int max_path_len; int adr_len; @@ -936,7 +937,7 @@ struct sockaddr_storage *str2sa_range(const char *str, int *port, int *low, int * .. */ prefix_path_len = (pfx && !abstract) ? strlen(pfx) : 0; - max_path_len = (sizeof(((struct sockaddr_un *)&ss)->sun_path) - 1) - + max_path_len = (sizeof(un->sun_path) - 1) - (prefix_path_len ? prefix_path_len + 1 + 5 + 1 + 3 : 0); adr_len = strlen(str2); @@ -946,10 +947,10 @@ struct sockaddr_storage *str2sa_range(const char *str, int *port, int *low, int } /* when abstract==1, we skip the first zero and copy all bytes except the trailing zero */ - memset(((struct sockaddr_un *)&ss)->sun_path, 0, sizeof(((struct sockaddr_un *)&ss)->sun_path)); + memset(un->sun_path, 0, sizeof(un->sun_path)); if (prefix_path_len) - memcpy(((struct sockaddr_un *)&ss)->sun_path, pfx, prefix_path_len); - memcpy(((struct sockaddr_un *)&ss)->sun_path + prefix_path_len + abstract, str2, adr_len + 1 - abstract); + memcpy(un->sun_path, pfx, prefix_path_len); + memcpy(un->sun_path + prefix_path_len + abstract, str2, adr_len + 1 - abstract); } else { /* IPv4 and IPv6 */ char *end = str2 + strlen(str2);