Module Name:    src
Committed By:   riastradh
Date:           Wed Jun 15 13:47:26 UTC 2016

Modified Files:
        src/doc: HACKS
        src/usr.sbin/wiconfig: Makefile wiconfig.c

Log Message:
Kill another strict aliasing violation.


To generate a diff of this commit:
cvs rdiff -u -r1.171 -r1.172 src/doc/HACKS
cvs rdiff -u -r1.6 -r1.7 src/usr.sbin/wiconfig/Makefile
cvs rdiff -u -r1.44 -r1.45 src/usr.sbin/wiconfig/wiconfig.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/doc/HACKS
diff -u src/doc/HACKS:1.171 src/doc/HACKS:1.172
--- src/doc/HACKS:1.171	Wed Jun 15 13:29:30 2016
+++ src/doc/HACKS	Wed Jun 15 13:47:26 2016
@@ -1,4 +1,4 @@
-# $NetBSD: HACKS,v 1.171 2016/06/15 13:29:30 riastradh Exp $
+# $NetBSD: HACKS,v 1.172 2016/06/15 13:47:26 riastradh Exp $
 #
 # This file is intended to document workarounds for currently unsolved
 # (mostly) compiler bugs.
@@ -278,7 +278,6 @@ file	usr.sbin/rbootd/Makefile	: 1.10
 file	usr.sbin/rpc.pcnfsd/Makefile	: 1.17
 file	usr.sbin/rtadvd/Makefile	: 1.9
 file	usr.sbin/tcpdump/Makefile	: 1.42
-file	usr.sbin/wiconfig/Makefile	: 1.3
 descr
 	GCC 4.1 warns on pointer sign comparision/assignments and lots of
 	code does not conform.  For now we use -Wno-pointer-sign and

Index: src/usr.sbin/wiconfig/Makefile
diff -u src/usr.sbin/wiconfig/Makefile:1.6 src/usr.sbin/wiconfig/Makefile:1.7
--- src/usr.sbin/wiconfig/Makefile:1.6	Fri Aug 10 12:10:30 2012
+++ src/usr.sbin/wiconfig/Makefile	Wed Jun 15 13:47:26 2016
@@ -1,10 +1,6 @@
-#	$NetBSD: Makefile,v 1.6 2012/08/10 12:10:30 joerg Exp $
+#	$NetBSD: Makefile,v 1.7 2016/06/15 13:47:26 riastradh Exp $
 
 PROG=	wiconfig
 MAN=	wiconfig.8
 
 .include <bsd.prog.mk>
-
-.if defined(HAVE_GCC) || defined(HAVE_LLVM)
-COPTS+=	-fno-strict-aliasing
-.endif

Index: src/usr.sbin/wiconfig/wiconfig.c
diff -u src/usr.sbin/wiconfig/wiconfig.c:1.44 src/usr.sbin/wiconfig/wiconfig.c:1.45
--- src/usr.sbin/wiconfig/wiconfig.c:1.44	Thu Apr 12 11:46:14 2012
+++ src/usr.sbin/wiconfig/wiconfig.c	Wed Jun 15 13:47:26 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: wiconfig.c,v 1.44 2012/04/12 11:46:14 joerg Exp $	*/
+/*	$NetBSD: wiconfig.c,v 1.45 2016/06/15 13:47:26 riastradh Exp $	*/
 /*
  * Copyright (c) 1997, 1998, 1999
  *	Bill Paul <wp...@ctr.columbia.edu>.  All rights reserved.
@@ -68,7 +68,7 @@
 #if !defined(lint)
 __COPYRIGHT("@(#) Copyright (c) 1997, 1998, 1999\
  Bill Paul.  All rights reserved.");
-__RCSID("$NetBSD: wiconfig.c,v 1.44 2012/04/12 11:46:14 joerg Exp $");
+__RCSID("$NetBSD: wiconfig.c,v 1.45 2016/06/15 13:47:26 riastradh Exp $");
 #endif
 
 struct wi_table {
@@ -156,7 +156,8 @@ wi_apscan(char *iface)
 	int			naps, rate;
 	int			retries = 10;
 	int			flags;
-	struct wi_apinfo	*w;
+	struct wi_apinfo	aps[howmany(WI_MAX_DATALEN,
+				    sizeof(struct wi_apinfo))];
 	int			i, j;
 
 	if (iface == NULL)
@@ -212,15 +213,21 @@ wi_apscan(char *iface)
 		err(1, "ioctl");
 	}
 
-	naps = *(int *)wreq.wi_val;
+	memcpy(&naps, wreq.wi_val, sizeof(int));
 
 	if (naps > 0)
 		printf("\nAP Information\n");
 	else
 		printf("\nNo APs available\n");
 
-	w =  (struct wi_apinfo *)(((char *)&wreq.wi_val) + sizeof(int));
-	for ( i = 0; i < naps; i++, w++) {
+	naps = MIN((unsigned)naps,
+	    howmany(sizeof(wreq.wi_val) - sizeof(int), sizeof(*aps)));
+	memcpy(aps, (const char *)wreq.wi_val + sizeof(int),
+	    (unsigned)naps * sizeof(*aps));
+
+	for (i = 0; i < naps; i++) {
+		const struct wi_apinfo *const w = &aps[i];
+
 		printf("ap[%d]:\n", i);
 		if (w->scanreason) {
 			static const char *scanm[] = {

Reply via email to