diff options
author | Volker Lendecke <vl@samba.org> | 2018-10-04 16:42:45 +0200 |
---|---|---|
committer | Jeremy Allison <jra@samba.org> | 2018-10-08 22:17:10 +0200 |
commit | ade339c8c396dbeff44b24a3d0eb4e59f40ff25d (patch) | |
tree | bd7a5f9d32f994db6bac11406e4f9a26d125a553 | |
parent | e02c4a417ed36373e0cbeb0d6c789444677b0c1e (diff) | |
download | samba-ade339c8c396dbeff44b24a3d0eb4e59f40ff25d.tar.gz |
tdb: Make get_hash_length circular-safe
Signed-off-by: Volker Lendecke <vl@samba.org>
Reviewed-by: Jeremy Allison <jra@samba.org>
-rw-r--r-- | lib/tdb/common/summary.c | 8 |
1 files changed, 8 insertions, 0 deletions
diff --git a/lib/tdb/common/summary.c b/lib/tdb/common/summary.c index c9b5bc4c1d0..a93eb93e734 100644 --- a/lib/tdb/common/summary.c +++ b/lib/tdb/common/summary.c @@ -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; } |