Browse Source

tdb: fix tdb_check() on other-endian tdbs.

We must not endian-convert the magic string, just the rest.
Rusty Russell 15 years ago
parent
commit
a1ace0cd11
4 changed files with 15 additions and 2 deletions
  1. 1 1
      ccan/tdb/check.c
  2. 14 1
      ccan/tdb/test/run-check.c
  3. BIN
      ccan/tdb/test/tdb-be.tdb
  4. BIN
      ccan/tdb/test/tdb-le.tdb

+ 1 - 1
ccan/tdb/check.c

@@ -30,7 +30,7 @@ static bool tdb_check_header(struct tdb_context *tdb, tdb_off_t *recovery)
 {
 	struct tdb_header hdr;
 
-	if (tdb->methods->tdb_read(tdb, 0, &hdr, sizeof(hdr), DOCONV()) == -1)
+	if (tdb->methods->tdb_read(tdb, 0, &hdr, sizeof(hdr), 0) == -1)
 		return false;
 	if (strcmp(hdr.magic_food, TDB_MAGIC_FOOD) != 0)
 		goto corrupt;

+ 14 - 1
ccan/tdb/test/run-check.c

@@ -19,7 +19,7 @@ int main(int argc, char *argv[])
 	struct tdb_context *tdb;
 	TDB_DATA key, data;
 
-	plan_tests(9);
+	plan_tests(13);
 	tdb = tdb_open_ex("run-check.tdb", 1, TDB_CLEAR_IF_FIRST,
 			  O_CREAT|O_TRUNC|O_RDWR, 0600, &taplogctx, NULL);
 
@@ -48,5 +48,18 @@ int main(int argc, char *argv[])
 	ok1(tdb_error(tdb) == TDB_ERR_CORRUPT);
 	tdb_close(tdb);
 
+	/* Big and little endian should work! */
+	tdb = tdb_open_ex("test/tdb-le.tdb", 1024, 0, O_RDWR, 0,
+			  &taplogctx, NULL);
+	ok1(tdb);
+	ok1(tdb_check(tdb, NULL, NULL) == 0);
+	tdb_close(tdb);
+
+	tdb = tdb_open_ex("test/tdb-be.tdb", 1024, 0, O_RDWR, 0,
+			  &taplogctx, NULL);
+	ok1(tdb);
+	ok1(tdb_check(tdb, NULL, NULL) == 0);
+	tdb_close(tdb);
+
 	return exit_status();
 }

BIN
ccan/tdb/test/tdb-be.tdb


BIN
ccan/tdb/test/tdb-le.tdb