]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
tdb: Make get_hash_length circular-safe
authorVolker Lendecke <vl@samba.org>
Thu, 4 Oct 2018 14:42:45 +0000 (16:42 +0200)
committerJeremy Allison <jra@samba.org>
Mon, 8 Oct 2018 20:17:10 +0000 (22:17 +0200)
Signed-off-by: Volker Lendecke <vl@samba.org>
Reviewed-by: Jeremy Allison <jra@samba.org>
lib/tdb/common/summary.c

index c9b5bc4c1d0b490b9948bde4ad6c93e9fc13aa04..a93eb93e734123041b0aafb7bc22ddb89e61866e 100644 (file)
@@ -72,18 +72,26 @@ static size_t tally_mean(const struct tally *tally)
 static size_t get_hash_length(struct tdb_context *tdb, unsigned int i)
 {
        tdb_off_t rec_ptr;
+       struct tdb_chainwalk_ctx chainwalk;
        size_t count = 0;
 
        if (tdb_ofs_read(tdb, TDB_HASH_TOP(i), &rec_ptr) == -1)
                return 0;
 
+       tdb_chainwalk_init(&chainwalk, rec_ptr);
+
        /* keep looking until we find the right record */
        while (rec_ptr) {
                struct tdb_record r;
+               bool ok;
                ++count;
                if (tdb_rec_read(tdb, rec_ptr, &r) == -1)
                        return 0;
                rec_ptr = r.next;
+               ok = tdb_chainwalk_check(tdb, &chainwalk, rec_ptr);
+               if (!ok) {
+                       return SIZE_MAX;
+               }
        }
        return count;
 }