summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVolker Lendecke <vl@samba.org>2018-10-04 16:42:45 +0200
committerJeremy Allison <jra@samba.org>2018-10-08 22:17:10 +0200
commitade339c8c396dbeff44b24a3d0eb4e59f40ff25d (patch)
treebd7a5f9d32f994db6bac11406e4f9a26d125a553
parente02c4a417ed36373e0cbeb0d6c789444677b0c1e (diff)
downloadsamba-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.c8
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;
}