svn commit: r224464 - in stable/8/sys: geom/part sys
Andriy Gapon
avg at FreeBSD.org
Thu Jul 28 09:37:03 UTC 2011
on 28/07/2011 05:40 Jason Hellenthal said the following:
>
>
> On Wed, Jul 27, 2011 at 04:10:33AM +0000, Andrey V. Elsukov wrote:
>> Author: ae Date: Wed Jul 27 04:10:32 2011 New Revision: 224464 URL:
>> http://svn.freebsd.org/changeset/base/224464
>>
>> Log: MFC r223587: MS Windows NT+ uses 4 bytes at offset 0x1b8 in the MBR to
>> identify disk drive. The boot0cfg(8) utility preserves these 4 bytes when
>> it is writing bootcode to keep a multiboot ability. Change gpart's bootcode
>> method to keep DSN if it is not zero. Also do not allow writing bootcode
>> with size not equal to MBRSIZE.
>>
>> PR: kern/157819
>>
>> Modified: stable/8/sys/geom/part/g_part_mbr.c stable/8/sys/sys/diskmbr.h
>> Directory Properties: stable/8/sys/ (props changed)
>> stable/8/sys/amd64/include/xen/ (props changed)
>> stable/8/sys/cddl/contrib/opensolaris/ (props changed)
>> stable/8/sys/contrib/dev/acpica/ (props changed) stable/8/sys/contrib/pf/
>> (props changed) stable/8/sys/geom/label/ (props changed)
>>
>> Modified: stable/8/sys/geom/part/g_part_mbr.c
>> ==============================================================================
>>
>>
--- stable/8/sys/geom/part/g_part_mbr.c Wed Jul 27 01:57:24 2011 (r224463)
>> +++ stable/8/sys/geom/part/g_part_mbr.c Wed Jul 27 04:10:32 2011 (r224464)
>> @@ -234,14 +234,16 @@ static int g_part_mbr_bootcode(struct g_part_table
>> *basetable, struct g_part_parms *gpp) { struct g_part_mbr_table *table; -
>> size_t codesz; + uint32_t dsn; + + if (gpp->gpp_codesize != MBRSIZE) +
>> return (ENODEV);
>
> Is it known for an absolute fact that the size being written is always going
> to be the size of MBRSIZE ? never less ? wouldnt ">=" greater-than or equal
> make sense here ? though I would seriously doubt it needs to return on equal
> too as that could be written.
>
>>
>> - codesz = DOSPARTOFF; table = (struct g_part_mbr_table *)basetable; -
>> bzero(table->mbr, codesz); - codesz = MIN(codesz, gpp->gpp_codesize); - if
>> (codesz > 0) - bcopy(gpp->gpp_codeptr, table->mbr, codesz); + dsn =
>> *(uint32_t *)(table->mbr + DOSDSNOFF); + bcopy(gpp->gpp_codeptr,
>> table->mbr, DOSPARTOFF); + if (dsn != 0)
>
> Shit happens... any case that the product might return less than 0 causing
> this to still fall through and process... ? ">" ?
Not with unsigned types :-)
>> + *(uint32_t *)(table->mbr + DOSDSNOFF) = dsn; return (0); }
>>
>>
>> Modified: stable/8/sys/sys/diskmbr.h
>> ==============================================================================
>>
>>
--- stable/8/sys/sys/diskmbr.h Wed Jul 27 01:57:24 2011 (r224463)
>> +++ stable/8/sys/sys/diskmbr.h Wed Jul 27 04:10:32 2011 (r224464) @@ -36,6
>> +36,7 @@ #include <sys/ioccom.h>
>>
>> #define DOSBBSECTOR 0 /* DOS boot block relative sector number */ +#define
>> DOSDSNOFF 440 /* WinNT/2K/XP Drive Serial Number offset */ #define
>> DOSPARTOFF 446 #define DOSPARTSIZE 16 #define NDOSPART 4
--
Andriy Gapon
More information about the svn-src-stable-8
mailing list