svn commit: r224464 - in stable/8/sys: geom/part sys

Jason Hellenthal jhell at DataIX.net
Thu Jul 28 02:40:17 UTC 2011



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... ? ">" ?

> +		*(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
> _______________________________________________
> svn-src-stable-8 at freebsd.org mailing list
> http://lists.freebsd.org/mailman/listinfo/svn-src-stable-8
> To unsubscribe, send any mail to "svn-src-stable-8-unsubscribe at freebsd.org"
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 522 bytes
Desc: not available
Url : http://lists.freebsd.org/pipermail/svn-src-stable/attachments/20110728/edca3c91/attachment.pgp


More information about the svn-src-stable mailing list