Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 20 Feb 2019 18:30:54 +0000 (UTC)
From:      Kyle Evans <kevans@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-11@freebsd.org
Subject:   svn commit: r344370 - stable/11/stand/userboot/userboot
Message-ID:  <201902201830.x1KIUskL092224@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: kevans
Date: Wed Feb 20 18:30:54 2019
New Revision: 344370
URL: https://svnweb.freebsd.org/changeset/base/344370

Log:
  MFC r334412: userboot: Fix bad type-punning
  
  Pass a struct devdesc to the format commands. Use proper type rather
  than doing weird type-punning that happened to work because the size
  was right. We copied a zfs devdesc into a disk_devdesc and then after
  passing through a NULL pointer reinterpreted it as a
  zfs_devdesc. Instead, pass the base devdesc around and 'upcase' when
  we know the types are right.
  
  This has the happy side effect of fixing a gcc warning about bad
  type punning.

Modified:
  stable/11/stand/userboot/userboot/devicename.c
  stable/11/stand/userboot/userboot/main.c
Directory Properties:
  stable/11/   (props changed)

Modified: stable/11/stand/userboot/userboot/devicename.c
==============================================================================
--- stable/11/stand/userboot/userboot/devicename.c	Wed Feb 20 18:29:52 2019	(r344369)
+++ stable/11/stand/userboot/userboot/devicename.c	Wed Feb 20 18:30:54 2019	(r344370)
@@ -175,30 +175,30 @@ userboot_parsedev(struct disk_devdesc **dev, const cha
 char *
 userboot_fmtdev(void *vdev)
 {
-    struct disk_devdesc	*dev = (struct disk_devdesc *)vdev;
+    struct devdesc	*dev = (struct devdesc *)vdev;
     static char		buf[128];	/* XXX device length constant? */
 
-    switch(dev->dd.d_dev->dv_type) {
+    switch(dev->d_dev->dv_type) {
     case DEVT_NONE:
 	strcpy(buf, "(no device)");
 	break;
 
     case DEVT_CD:
-	sprintf(buf, "%s%d:", dev->dd.d_dev->dv_name, dev->dd.d_unit);
+	sprintf(buf, "%s%d:", dev->d_dev->dv_name, dev->d_unit);
 	break;
 
     case DEVT_DISK:
 	return (disk_fmtdev(vdev));
 
     case DEVT_NET:
-	sprintf(buf, "%s%d:", dev->dd.d_dev->dv_name, dev->dd.d_unit);
+	sprintf(buf, "%s%d:", dev->d_dev->dv_name, dev->d_unit);
 	break;
 
     case DEVT_ZFS:
 #if defined(USERBOOT_ZFS_SUPPORT)
 	return (zfs_fmtdev(vdev));
 #else
-	sprintf(buf, "%s%d:", dev->dd.d_dev->dv_name, dev->dd.d_unit);
+	sprintf(buf, "%s%d:", dev->d_dev->dv_name, dev->d_unit);
 #endif
 	break;
     }

Modified: stable/11/stand/userboot/userboot/main.c
==============================================================================
--- stable/11/stand/userboot/userboot/main.c	Wed Feb 20 18:29:52 2019	(r344369)
+++ stable/11/stand/userboot/userboot/main.c	Wed Feb 20 18:30:54 2019	(r344370)
@@ -154,19 +154,18 @@ static void
 extract_currdev(void)
 {
 	struct disk_devdesc dev;
-
-	//bzero(&dev, sizeof(dev));
-
+	struct devdesc *dd;
 #if defined(USERBOOT_ZFS_SUPPORT)
+	struct zfs_devdesc zdev;
+
 	if (userboot_zfs_found) {
-		struct zfs_devdesc zdev;
 	
 		/* Leave the pool/root guid's unassigned */
 		bzero(&zdev, sizeof(zdev));
 		zdev.dd.d_dev = &zfs_dev;
 		
-		dev = *(struct disk_devdesc *)&zdev;
-		init_zfs_bootenv(zfs_fmtdev(&dev));
+		init_zfs_bootenv(zfs_fmtdev(&zdev));
+		dd = &zdev.dd;
 	} else
 #endif
 
@@ -183,14 +182,16 @@ extract_currdev(void)
 			dev.d_slice = -1;
 			dev.d_partition = -1;
 		}
+		dd = &dev.dd;
 	} else {
 		dev.dd.d_dev = &host_dev;
 		dev.dd.d_unit = 0;
+		dd = &dev.dd;
 	}
 
-	env_setenv("currdev", EV_VOLATILE, userboot_fmtdev(&dev),
+	env_setenv("currdev", EV_VOLATILE, userboot_fmtdev(dd),
 	    userboot_setcurrdev, env_nounset);
-	env_setenv("loaddev", EV_VOLATILE, userboot_fmtdev(&dev),
+	env_setenv("loaddev", EV_VOLATILE, userboot_fmtdev(dd),
 	    env_noset, env_nounset);
 }
 



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201902201830.x1KIUskL092224>