X-Git-Url: http://git.ozlabs.org/?a=blobdiff_plain;f=ccan%2Ftdb2%2Fsummary.c;h=3df822ba7a11f6c0c7929b5e02473097e7ad8f58;hb=d1383862ad9a74e713dc915d351b74da4db35078;hp=e9f986e7727a4775928617256ed65e11e0dbaa5c;hpb=8c7516decc0a0921b4fd45eef401e07eb58e0b01;p=ccan diff --git a/ccan/tdb2/summary.c b/ccan/tdb2/summary.c index e9f986e7..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; @@ -89,7 +92,7 @@ static tdb_len_t summarize_zone(struct tdb_context *tdb, tdb_off_t zone_off, p = tdb_get(tdb, off, &pad, sizeof(pad)); if (!p) return TDB_OFF_ERR; - if (frec_magic(&p->f) == TDB_FREE_MAGIC) { + if (rec_magic(&p->u) != TDB_MAGIC) { len = p->f.data_len; tally_add(free, len); bucketlen[size_to_bucket(frec_zone_bits(&p->f), len)]++;