tdb: fix tdb_check() on other-endian tdbs.
authorRusty Russell <rusty@rustcorp.com.au>
Mon, 13 Sep 2010 09:17:14 +0000 (18:47 +0930)
committerRusty Russell <rusty@rustcorp.com.au>
Mon, 13 Sep 2010 09:17:14 +0000 (18:47 +0930)
We must not endian-convert the magic string, just the rest.

ccan/tdb/check.c
ccan/tdb/test/run-check.c
ccan/tdb/test/tdb-be.tdb [new file with mode: 0644]
ccan/tdb/test/tdb-le.tdb [new file with mode: 0644]

index a9a9ece0da37c01eb87c0dbf3e4ac6ee05250d07..53fb286613a3e829e8f2aa159109124c3e182503 100644 (file)
@@ -30,7 +30,7 @@ static bool tdb_check_header(struct tdb_context *tdb, tdb_off_t *recovery)
 {
        struct tdb_header hdr;
 
 {
        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;
                return false;
        if (strcmp(hdr.magic_food, TDB_MAGIC_FOOD) != 0)
                goto corrupt;
index fe0842d3d0aa62f260e93ee307b21412b4d72eb6..4a57eb6f88d109819e2d54b096d40b65cffaeb82 100644 (file)
@@ -19,7 +19,7 @@ int main(int argc, char *argv[])
        struct tdb_context *tdb;
        TDB_DATA key, data;
 
        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);
 
        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);
 
        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();
 }
        return exit_status();
 }
diff --git a/ccan/tdb/test/tdb-be.tdb b/ccan/tdb/test/tdb-be.tdb
new file mode 100644 (file)
index 0000000..1c49116
Binary files /dev/null and b/ccan/tdb/test/tdb-be.tdb differ
diff --git a/ccan/tdb/test/tdb-le.tdb b/ccan/tdb/test/tdb-le.tdb
new file mode 100644 (file)
index 0000000..0655072
Binary files /dev/null and b/ccan/tdb/test/tdb-le.tdb differ