]> git.ozlabs.org Git - ccan/blobdiff - ccan/tdb/tdb.c
Don't fail mysteriously on existing trace file.
[ccan] / ccan / tdb / tdb.c
index 3acf05b96e15fdebc4ef893139a477907d293a30..42d2438b08be960838733f24bd422f6fdbcaad19 100644 (file)
@@ -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)
 {