[PATCH 13/13] Avoid type-punned pointers that break strict-aliasing

Ron ron at debian.org
Fri Jun 26 19:14:28 UTC 2009


Signed-off-by: Ron Lee <ron at debian.org>
---
 ldso/ldso/dl-elf.c      |    4 +++-
 ldso/ldso/dl-startup.c  |    3 ++-
 libc/inet/getaddrinfo.c |    9 ++++++---
 3 files changed, 11 insertions(+), 5 deletions(-)

diff --git a/ldso/ldso/dl-elf.c b/ldso/ldso/dl-elf.c
index 5f59162..8970849 100644
--- a/ldso/ldso/dl-elf.c
+++ b/ldso/ldso/dl-elf.c
@@ -338,6 +338,7 @@ struct elf_resolve *_dl_load_elf_shared_library(int secure,
 	ElfW(Addr) relro_addr = 0;
 	size_t relro_size = 0;
 	struct stat st;
+	uint32_t *p32;
 	DL_LOADADDR_TYPE lib_loadaddr;
 	DL_INIT_LOADADDR_EXTRA_DECLS
 
@@ -382,7 +383,8 @@ struct elf_resolve *_dl_load_elf_shared_library(int secure,
 
 	_dl_read(infile, header, _dl_pagesize);
 	epnt = (ElfW(Ehdr) *) (intptr_t) header;
-	if (*((uint32_t*) &epnt->e_ident) != ELFMAG_U32) {
+	p32 = (uint32_t*)&epnt->e_ident;
+	if (*p32 != ELFMAG_U32) {
 		_dl_dprintf(2, "%s: '%s' is not an ELF file\n", _dl_progname,
 				libname);
 		_dl_internal_error_number = LD_ERROR_NOTELF;
diff --git a/ldso/ldso/dl-startup.c b/ldso/ldso/dl-startup.c
index 70942bc..de9c8bc 100644
--- a/ldso/ldso/dl-startup.c
+++ b/ldso/ldso/dl-startup.c
@@ -121,6 +121,7 @@ DL_START(unsigned long args)
 	struct elf_resolve *tpnt = &tpnt_tmp;
 	ElfW(auxv_t) auxvt[AT_EGID + 1];
 	ElfW(Dyn) *dpnt;
+	uint32_t  *p32;
 
 	/* WARNING! -- we cannot make _any_ function calls until we have
 	 * taken care of fixing up our own relocations.  Making static
@@ -176,7 +177,7 @@ DL_START(unsigned long args)
 			/* Do not use an inline _dl_strncmp here or some arches
 			* will blow chunks, i.e. those that need to relocate all
 			* string constants... */
-			|| *((uint32_t*) &header->e_ident) != ELFMAG_U32
+			|| *(p32 = (uint32_t*)&header->e_ident) != ELFMAG_U32
 	) {
 		SEND_EARLY_STDERR("Invalid ELF header\n");
 		_dl_exit(0);
diff --git a/libc/inet/getaddrinfo.c b/libc/inet/getaddrinfo.c
index 1953e6f..2839bda 100644
--- a/libc/inet/getaddrinfo.c
+++ b/libc/inet/getaddrinfo.c
@@ -544,7 +544,8 @@ gaih_inet(const char *name, const struct gaih_service *service,
 
 				if (scope_delim != NULL) {
 					int try_numericscope = 0;
-					if (IN6_IS_ADDR_LINKLOCAL(at->addr) || IN6_IS_ADDR_MC_LINKLOCAL(at->addr)) {
+					uint32_t *a32 = (uint32_t*)at->addr;
+					if (IN6_IS_ADDR_LINKLOCAL(a32) || IN6_IS_ADDR_MC_LINKLOCAL(at->addr)) {
 						at->scopeid = if_nametoindex(scope_delim + 1);
 						if (at->scopeid == 0)
 							try_numericscope = 1;
@@ -622,8 +623,10 @@ gaih_inet(const char *name, const struct gaih_service *service,
 #endif
 		if (req->ai_family == 0 || req->ai_family == AF_INET) {
 			atr->family = AF_INET;
-			if ((req->ai_flags & AI_PASSIVE) == 0)
-				*(uint32_t*)atr->addr = htonl(INADDR_LOOPBACK);
+			if ((req->ai_flags & AI_PASSIVE) == 0) {
+				uint32_t *a = (uint32_t*)atr->addr;
+				*a = htonl(INADDR_LOOPBACK);
+			}
 		}
 	}
 
-- 
1.6.3.1



More information about the uClibc mailing list