tdb2: fix infinite loop in tdb_check
authorRusty Russell <rusty@rustcorp.com.au>
Mon, 18 Oct 2010 02:54:20 +0000 (13:24 +1030)
committerRusty Russell <rusty@rustcorp.com.au>
Mon, 18 Oct 2010 02:54:20 +0000 (13:24 +1030)
check_free_list returns a length, not bool.

ccan/tdb2/check.c

index cb864ab74ff5a34707199ef374bdc67fede666e9..c2ca95d08bcddfa98444d3d1354987c8168ce19a 100644 (file)
@@ -336,11 +336,11 @@ static tdb_len_t check_free_list(struct tdb_context *tdb,
                h = bucket_off(zone_off, i);
                for (off = tdb_read_off(tdb, h); off; off = f.next) {
                        if (off == TDB_OFF_ERR)
-                               return false;
+                               return TDB_OFF_ERR;
                        if (tdb_read_convert(tdb, off, &f, sizeof(f)))
-                               return false;
+                               return TDB_OFF_ERR;
                        if (!check_free(tdb, off, &f, prev, zone_off, i))
-                               return false;
+                               return TDB_OFF_ERR;
 
                        /* FIXME: Check hash bits */
                        p = asearch(&off, free, num_free, off_cmp);
@@ -350,7 +350,7 @@ static tdb_len_t check_free_list(struct tdb_context *tdb,
                                         "tdb_check: Invalid offset"
                                         " %llu in free table\n",
                                         (long long)off);
-                               return false;
+                               return TDB_OFF_ERR;
                        }
                        /* Mark it invalid. */
                        *p ^= 1;