Module Name:    src
Committed By:   christos
Date:           Thu Oct 31 20:31:04 UTC 2013

Modified Files:
        src/sys/arch/i386/stand/lib: biosdisk.c

Log Message:
avoid pointer aliasing problems.


To generate a diff of this commit:
cvs rdiff -u -r1.42 -r1.43 src/sys/arch/i386/stand/lib/biosdisk.c

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

Modified files:

Index: src/sys/arch/i386/stand/lib/biosdisk.c
diff -u src/sys/arch/i386/stand/lib/biosdisk.c:1.42 src/sys/arch/i386/stand/lib/biosdisk.c:1.43
--- src/sys/arch/i386/stand/lib/biosdisk.c:1.42	Tue Jul  3 11:24:37 2012
+++ src/sys/arch/i386/stand/lib/biosdisk.c	Thu Oct 31 16:31:04 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: biosdisk.c,v 1.42 2012/07/03 15:24:37 tsutsui Exp $	*/
+/*	$NetBSD: biosdisk.c,v 1.43 2013/10/31 20:31:04 christos Exp $	*/
 
 /*
  * Copyright (c) 1996, 1998
@@ -118,6 +118,8 @@ static struct btinfo_bootdisk bi_disk;
 static struct btinfo_bootwedge bi_wedge;
 #endif
 
+#define MBR_PARTS(buf) ((char *)(buf) + offsetof(struct mbr_sector, mbr_parts))
+
 #define	RF_PROTECTED_SECTORS	64	/* XXX refer to <.../rf_optnames.h> */
 
 int
@@ -231,7 +233,7 @@ check_gpt(struct biosdisk *d, daddr_t se
 		return EIO;
 	}
 
-	gpth = *(const struct gpt_hdr *)d->buf;
+	memcpy(&gpth, d->buf, sizeof(gpth));
 
 	if (memcmp(GPT_HDR_SIG, gpth.hdr_sig, sizeof(gpth.hdr_sig)))
 		return -1;
@@ -423,7 +425,7 @@ read_minix_subp(struct biosdisk *d, stru
 	if ((uint8_t)d->buf[510] != 0x55 || (uint8_t)d->buf[511] != 0xAA) {
 		return -1;
 	}
-	memcpy(&mbr, ((struct mbr_sector *)d->buf)->mbr_parts, sizeof(mbr));
+	memcpy(&mbr, MBR_PARTS(d->buf), sizeof(mbr));
 	for (i = 0; i < MBR_PART_COUNT; i++) {
 		typ = mbr[i].mbrp_type;
 		if (typ == 0)
@@ -478,8 +480,7 @@ read_label(struct biosdisk *d)
 #endif
 			return EIO;
 		}
-		memcpy(&mbr, ((struct mbr_sector *)d->buf)->mbr_parts,
-		       sizeof(mbr));
+		memcpy(&mbr, MBR_PARTS(d->buf), sizeof(mbr));
 		/* Look for NetBSD partition ID */
 		for (i = 0; i < MBR_PART_COUNT; i++) {
 			typ = mbr[i].mbrp_type;

Reply via email to