Author: kp
Date: Sun Aug  5 11:15:28 2018
New Revision: 337349
URL: https://svnweb.freebsd.org/changeset/base/337349

Log:
  zfsboot: Fix startup crash
  
  On a FreeNAS mini XL, with geli encrypted drives the loader crashed in
  geli_read().
  
  When we iterate over the list of disks and allocate the zfsdsk structures we
  don’t zero out the gdev pointer. In one case that resulted in geli_read()
  (called on the bogus pointer) dividing by zero.
  
  Use calloc() to ensure the zfsdsk structure is always zeroed, so the pointer 
is
  initialised to NULL. As a side benefit it gets rid of one #ifdef
  LOADER_GELI_SUPPORT.

Modified:
  head/stand/i386/zfsboot/zfsboot.c

Modified: head/stand/i386/zfsboot/zfsboot.c
==============================================================================
--- head/stand/i386/zfsboot/zfsboot.c   Sun Aug  5 11:14:13 2018        
(r337348)
+++ head/stand/i386/zfsboot/zfsboot.c   Sun Aug  5 11:15:28 2018        
(r337349)
@@ -707,10 +707,7 @@ main(void)
     }
     setheap(heap_next, heap_end);
 
-    zdsk = malloc(sizeof(struct zfsdsk));
-#ifdef LOADER_GELI_SUPPORT
-    zdsk->gdev = NULL;
-#endif
+    zdsk = calloc(1, sizeof(struct zfsdsk));
     zdsk->dsk.drive = *(uint8_t *)PTOV(ARGS);
     zdsk->dsk.type = zdsk->dsk.drive & DRV_HARD ? TYPE_AD : TYPE_FD;
     zdsk->dsk.unit = zdsk->dsk.drive & DRV_MASK;
@@ -758,7 +755,7 @@ main(void)
        if (!int13probe(i | DRV_HARD))
            break;
 
-       zdsk = malloc(sizeof(struct zfsdsk));
+       zdsk = calloc(1, sizeof(struct zfsdsk));
        zdsk->dsk.drive = i | DRV_HARD;
        zdsk->dsk.type = zdsk->dsk.drive & TYPE_AD;
        zdsk->dsk.unit = i;
_______________________________________________
[email protected] mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "[email protected]"

Reply via email to