ubik: ntohl on reading the replay log
authorAndrew Deason <adeason@sinenomine.net>
Fri, 18 Jun 2010 22:20:22 +0000 (17:20 -0500)
committerDerrick Brashear <shadow@dementia.org>
Tue, 22 Jun 2010 01:54:52 +0000 (18:54 -0700)
When attempting to read the replay log, ubik was not ntohl'ing all
integers that were read in from the log, causing the log to appear
invalid on little-endian systems. Fix it.

This problem manifests as apparent corruption in the database on top
of ubik when a commit is occurring when we are shut down, or a disk
error is encountered during a commit.

Change-Id: I82e04c59d0f55aa2105b02feb6ee332ea85eb4f3
Reviewed-on: http://gerrit.openafs.org/2224
Tested-by: Andrew Deason <adeason@sinenomine.net>
Reviewed-by: Derrick Brashear <shadow@dementia.org>
Tested-by: Derrick Brashear <shadow@dementia.org>

src/ubik/recovery.c

index 6787c23..e9b3b9a 100644 (file)
@@ -226,6 +226,7 @@ ReplayLog(register struct ubik_dbase *adbase)
                             sizeof(afs_int32));
        if (code != sizeof(afs_int32))
            break;
+       opcode = ntohl(opcode);
        if (opcode == LOGNEW) {
            /* handle begin trans */
            tpos += sizeof(afs_int32);
@@ -250,7 +251,7 @@ ReplayLog(register struct ubik_dbase *adbase)
            if (code != 3 * sizeof(afs_int32))
                break;
            /* otherwise, skip over the data bytes, too */
-           tpos += buffer[2] + 3 * sizeof(afs_int32);
+           tpos += ntohl(buffer[2]) + 3 * sizeof(afs_int32);
        } else {
            ubik_dprint("corrupt log opcode (%d) at position %d\n", opcode,
                        tpos);
@@ -269,6 +270,7 @@ ReplayLog(register struct ubik_dbase *adbase)
                                 sizeof(afs_int32));
            if (code != sizeof(afs_int32))
                break;
+           opcode = ntohl(opcode);
            if (opcode == LOGNEW) {
                /* handle begin trans */
                tpos += sizeof(afs_int32);