X-Git-Url: http://git.ozlabs.org/?p=ccan;a=blobdiff_plain;f=ccan%2Ftdb2%2Fsummary.c;h=3df822ba7a11f6c0c7929b5e02473097e7ad8f58;hp=52103ea6b5247672ef24f808a97a1a99f4153466;hb=d1383862ad9a74e713dc915d351b74da4db35078;hpb=c5e3f07a30056cb7c3c380bf690f80815ca4b6b1 diff --git a/ccan/tdb2/summary.c b/ccan/tdb2/summary.c index 52103ea6..3df822ba 100644 --- a/ccan/tdb2/summary.c +++ b/ccan/tdb2/summary.c @@ -66,7 +66,7 @@ static tdb_len_t summarize_zone(struct tdb_context *tdb, tdb_off_t zone_off, unsigned int *num_buckets) { struct free_zone_header zhdr; - tdb_off_t off; + tdb_off_t off, end; tdb_len_t len; unsigned int hdrlen; tdb_len_t unc = 0; @@ -79,9 +79,12 @@ static tdb_len_t summarize_zone(struct tdb_context *tdb, tdb_off_t zone_off, hdrlen = sizeof(zhdr) + (BUCKETS_FOR_ZONE(zhdr.zone_bits) + 1) * sizeof(tdb_off_t); - for (off = zone_off + hdrlen; - off < zone_off + (1ULL << zhdr.zone_bits); - off += len) { + + end = zone_off + (1ULL << zhdr.zone_bits); + if (end > tdb->map_size) + end = tdb->map_size; + + for (off = zone_off + hdrlen; off < end; off += len) { union { struct tdb_used_record u; struct tdb_free_record f;