From: Colin Watson Date: Sat, 13 Mar 2010 00:46:35 +0000 (+0000) Subject: libblkid: fix infinite loop when probe chain bails out early X-Git-Url: https://err.no/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=046959cca19be0b1e489bae66314fcf6047fe4c5;p=util-linux libblkid: fix infinite loop when probe chain bails out early 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 Signed-off-by: Karel Zak --- diff --git a/shlibs/blkid/src/probe.c b/shlibs/blkid/src/probe.c index 6d61386c..ab1c8d58 100644 --- a/shlibs/blkid/src/probe.c +++ b/shlibs/blkid/src/probe.c @@ -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; diff --git a/shlibs/blkid/src/superblocks/superblocks.c b/shlibs/blkid/src/superblocks/superblocks.c index 56b334d0..05668e1e 100644 --- a/shlibs/blkid/src/superblocks/superblocks.c +++ b/shlibs/blkid/src/superblocks/superblocks.c @@ -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));