]> granicus.if.org Git - zfs/commitdiff
Fix function call with uninitialized value in vdev_inuse
authorRichard Yao <ryao@gentoo.org>
Wed, 23 Apr 2014 03:18:17 +0000 (23:18 -0400)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Tue, 23 Sep 2014 17:32:45 +0000 (10:32 -0700)
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

module/zfs/vdev_label.c

index 0780bf601ba37fae3b7a3863bff59ccd6122eef8..1c2f00fe2afd136f878903d520a00613f407bf84 100644 (file)
@@ -599,7 +599,8 @@ vdev_inuse(vdev_t *vd, uint64_t crtxg, vdev_labeltype_t reason,
         * read-only.  Instead we look to see if the pools is marked
         * read-only in the namespace and set the state to active.
         */
-       if ((spa = spa_by_guid(pool_guid, device_guid)) != NULL &&
+       if (state != POOL_STATE_SPARE && state != POOL_STATE_L2CACHE &&
+           (spa = spa_by_guid(pool_guid, device_guid)) != NULL &&
            spa_mode(spa) == FREAD)
                state = POOL_STATE_ACTIVE;