]> err.no Git - util-linux/commitdiff
libblkid: fix infinite loop when probe chain bails out early
authorColin Watson <cjwatson@canonical.com>
Sat, 13 Mar 2010 00:46:35 +0000 (00:46 +0000)
committerKarel Zak <kzak@redhat.com>
Mon, 22 Mar 2010 08:14:21 +0000 (09:14 +0100)
The superblocks probe bails out early with no results in some cases.  If
this happens, blkid_do_probe needs to go to the next chain, rather than
entering an infinite loop calling superblocks_probe over and over again.

[kzak@redhat.com: - print debug message always when leaving
                    superblocks_probe()]

Addresses: https://bugs.launchpad.net/bugs/528073
Signed-off-by: Colin Watson <cjwatson@canonical.com>
Signed-off-by: Karel Zak <kzak@redhat.com>
shlibs/blkid/src/probe.c
shlibs/blkid/src/superblocks/superblocks.c

index 6e8513d2266078a1bc906724cd1dd7b11c222e4c..d8da13c383e7b8cfe2f56ea9e0e0bce50621a66b 100644 (file)
@@ -717,10 +717,12 @@ int blkid_do_probe(blkid_probe pr)
                /* we go to the next chain only when the previous probing
                 * result was nothing (rc == 1) and when the current chain is
                 * disabled or we are at end of the current chain (chain->idx +
-                * 1 == sizeof chain)
+                * 1 == sizeof chain) or the current chain bailed out right at
+                * the start (chain->idx == -1)
                 */
                else if (rc == 1 && (chn->enabled == FALSE ||
-                                    chn->idx + 1 == chn->driver->nidinfos)) {
+                                    chn->idx + 1 == chn->driver->nidinfos ||
+                                    chn->idx == -1)) {
 
                        int idx = chn->driver->id + 1;
 
index 932701a8aa0e54197ff97e96fb856beebdcca9cb..f66efd4219b4df74b2eaec32135976c445d70b21 100644 (file)
@@ -314,7 +314,7 @@ static int superblocks_probe(blkid_probe pr, struct blkid_chain *chn)
                /* Ignore very very small block devices or regular files (e.g.
                 * extended partitions). Note that size of the UBI char devices
                 * is 1 byte */
-               return 1;
+               goto nothing;
 
        i = chn->idx + 1;
 
@@ -395,6 +395,8 @@ static int superblocks_probe(blkid_probe pr, struct blkid_chain *chn)
                        id->name, chn->idx));
                return 0;
        }
+
+nothing:
        DBG(DEBUG_LOWPROBE,
                printf("<-- leaving probing loop (failed) [SUBLKS idx=%d]\n",
                chn->idx));