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
_______________________________________________
[email protected] mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "[email protected]"

Reply via email to