From e3e2c216398b34e94a5d10701c8a25745cb910e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dag-Erling=20Sm=C3=B8rgrav?= Date: Tue, 6 Jul 2004 09:22:18 +0000 Subject: [PATCH] Rewrite twowords() to access its argument through a char pointer and not a short pointer. The previous implementation seems to be in a gray zone of the C standard, and GCC generates incorrect code for it at -O2 or higher on some platforms. --- lib/libalias/alias.c | 11 +++++++++-- sys/netinet/libalias/alias.c | 11 +++++++++-- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/lib/libalias/alias.c b/lib/libalias/alias.c index 832190057160..6acf03b01d44 100644 --- a/lib/libalias/alias.c +++ b/lib/libalias/alias.c @@ -139,9 +139,16 @@ __FBSDID("$FreeBSD$"); static __inline int twowords(void *p) { - u_short *s = p; + uint8_t *c = p; - return (s[0] + s[1]); +#if BYTE_ORDER == LITTLE_ENDIAN + uint16_t s1 = ((uint16_t)c[1] << 8) + (uint16_t)c[0]; + uint16_t s2 = ((uint16_t)c[3] << 8) + (uint16_t)c[2]; +#else + uint16_t s1 = ((uint16_t)c[0] << 8) + (uint16_t)c[1]; + uint16_t s2 = ((uint16_t)c[2] << 8) + (uint16_t)c[3]; +#endif + return (s1 + s2); } /* TCP Handling Routines diff --git a/sys/netinet/libalias/alias.c b/sys/netinet/libalias/alias.c index 832190057160..6acf03b01d44 100644 --- a/sys/netinet/libalias/alias.c +++ b/sys/netinet/libalias/alias.c @@ -139,9 +139,16 @@ __FBSDID("$FreeBSD$"); static __inline int twowords(void *p) { - u_short *s = p; + uint8_t *c = p; - return (s[0] + s[1]); +#if BYTE_ORDER == LITTLE_ENDIAN + uint16_t s1 = ((uint16_t)c[1] << 8) + (uint16_t)c[0]; + uint16_t s2 = ((uint16_t)c[3] << 8) + (uint16_t)c[2]; +#else + uint16_t s1 = ((uint16_t)c[0] << 8) + (uint16_t)c[1]; + uint16_t s2 = ((uint16_t)c[2] << 8) + (uint16_t)c[3]; +#endif + return (s1 + s2); } /* TCP Handling Routines