X-Git-Url: https://git.ozlabs.org/?p=ccan;a=blobdiff_plain;f=ccan%2Ftdb%2Ftdb.c;h=42d2438b08be960838733f24bd422f6fdbcaad19;hp=3acf05b96e15fdebc4ef893139a477907d293a30;hb=8f4a253ce07435870b61687e487df67a2ee7e19d;hpb=25db0fb4908967e045ff3c20f6eb98f8f43f0468 diff --git a/ccan/tdb/tdb.c b/ccan/tdb/tdb.c index 3acf05b9..42d2438b 100644 --- a/ccan/tdb/tdb.c +++ b/ccan/tdb/tdb.c @@ -96,6 +96,11 @@ static tdb_off_t tdb_find(struct tdb_context *tdb, TDB_DATA key, uint32_t hash, NULL) == 0) { return rec_ptr; } + /* detect tight infinite loop */ + if (rec_ptr == r->next) { + TDB_LOG((tdb, TDB_DEBUG_FATAL, "tdb_find: loop detected.\n")); + return TDB_ERRCODE(TDB_ERR_CORRUPT, 0); + } rec_ptr = r->next; } return TDB_ERRCODE(TDB_ERR_NOEXIST, 0); @@ -874,7 +879,7 @@ static void tdb_trace_end_ret(struct tdb_context *tdb, int ret) static void tdb_trace_record(struct tdb_context *tdb, TDB_DATA rec) { - char msg[20]; + char msg[20 + rec.dsize*2], *p; unsigned int i; /* We differentiate zero-length records from non-existent ones. */ @@ -882,12 +887,13 @@ static void tdb_trace_record(struct tdb_context *tdb, TDB_DATA rec) tdb_trace_write(tdb, " NULL"); return; } - sprintf(msg, " %zu:", rec.dsize); + + p = msg; + p += sprintf(p, " %zu:", rec.dsize); + for (i = 0; i < rec.dsize; i++) + p += sprintf(p, "%02x", rec.dptr[i]); + tdb_trace_write(tdb, msg); - for (i = 0; i < rec.dsize; i++) { - sprintf(msg, "%02x", rec.dptr[i]); - tdb_trace_write(tdb, msg); - } } void tdb_trace(struct tdb_context *tdb, const char *op) @@ -897,6 +903,16 @@ void tdb_trace(struct tdb_context *tdb, const char *op) tdb_trace_end(tdb); } +void tdb_trace_seqnum(struct tdb_context *tdb, uint32_t seqnum, const char *op) +{ + char msg[sizeof(tdb_off_t) * 4]; + + sprintf(msg, "%u ", seqnum); + tdb_trace_write(tdb, msg); + tdb_trace_write(tdb, op); + tdb_trace_end(tdb); +} + void tdb_trace_open(struct tdb_context *tdb, const char *op, unsigned hash_size, unsigned tdb_flags, unsigned open_flags) {