]> 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>
Sun, 14 Mar 2010 21:45:40 +0000 (22:45 +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 6d61386c1e718d7f1d293324ea0eab1214603484..ab1c8d5806caeaff807d58389d1c7e1cb395a666 100644 (file)
@@ -721,10 +721,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 56b334d03677601d960e667ca2baa0e01ee0f073..05668e1e2fc736e7434ddeffc046851968bdef54 100644 (file)
@@ -315,7 +315,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;
 
@@ -396,6 +396,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));