Skip to content

Commit 485c581

Browse files
ryaobehlendorf
authored andcommitted
Fix function call with uninitialized value in vdev_inuse
LLVM's static analyzer reported that we could pass an uninitialized pool_guid to spa_by_guid() in vdev_inuse(). Upon review, it is correct. An attempt to repurpose a spare or L2ARC drive from an exported pool will cause the pool_guid passed to spa_by_guid() to be unintialized information from the stack. This will cause non-deterministic behavior. Since there is no reason why we cannot repurpose such disks, we modify vdev_inuse() to avoid calling spa_by_guid() when they are detected. Signed-off-by: Richard Yao <ryao@gentoo.org> Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov> Issue #2330
1 parent 928ee9f commit 485c581

File tree

1 file changed

+2
-1
lines changed

1 file changed

+2
-1
lines changed

module/zfs/vdev_label.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -599,7 +599,8 @@ vdev_inuse(vdev_t *vd, uint64_t crtxg, vdev_labeltype_t reason,
599599
* read-only. Instead we look to see if the pools is marked
600600
* read-only in the namespace and set the state to active.
601601
*/
602-
if ((spa = spa_by_guid(pool_guid, device_guid)) != NULL &&
602+
if (state != POOL_STATE_SPARE && state != POOL_STATE_L2CACHE &&
603+
(spa = spa_by_guid(pool_guid, device_guid)) != NULL &&
603604
spa_mode(spa) == FREAD)
604605
state = POOL_STATE_ACTIVE;
605606

0 commit comments

Comments
 (0)