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;