3c1ad06
From 30c130df972756d651b33a2e0adf8f35052843c6 Mon Sep 17 00:00:00 2001
3c1ad06
From: "Richard W.M. Jones" <rjones@redhat.com>
3c1ad06
Date: Tue, 10 Sep 2013 19:05:15 +0100
3c1ad06
Subject: [PATCH] ppc: Fix endianness bug which caused node_add_child to fail.
3c1ad06
3c1ad06
Code used:
3c1ad06
3c1ad06
  le32toh (reg_field + 0x1000)
3c1ad06
3c1ad06
instead of the correct version:
3c1ad06
3c1ad06
  le32toh (reg_field) + 0x1000
3c1ad06
3c1ad06
The first incorrect form adds 0x1000 to the possibly byte-swapped
3c1ad06
registry field, corrupting it.
3c1ad06
3c1ad06
I used the following command to look for problems in the remaining
3c1ad06
code but did not find any:
3c1ad06
3c1ad06
  git grep -P 'le\d+toh\s*\([^)]*\+'
3c1ad06
3c1ad06
NOTE that 'htole32 (reg_field - 0x1000)' is correct.
3c1ad06
---
3c1ad06
 lib/write.c | 2 +-
3c1ad06
 1 file changed, 1 insertion(+), 1 deletion(-)
3c1ad06
3c1ad06
diff --git a/lib/write.c b/lib/write.c
3c1ad06
index 8515350..bc2251c 100644
3c1ad06
--- a/lib/write.c
3c1ad06
+++ b/lib/write.c
3c1ad06
@@ -570,7 +570,7 @@ insert_subkey (hive_h *h, const char *name,
3c1ad06
         struct ntreg_ri_record *ri =
3c1ad06
           (struct ntreg_ri_record *) ((char *) h->addr + blocks[i]);
3c1ad06
         for (j = 0; j < le16toh (ri->nr_offsets); ++j)
3c1ad06
-          if (le32toh (ri->offset[j] + 0x1000) == old_offs) {
3c1ad06
+          if (le32toh (ri->offset[j]) + 0x1000 == old_offs) {
3c1ad06
             DEBUG (2, "replacing ri (0x%zx) ->offset[%zu] 0x%zx -> 0x%zx",
3c1ad06
                    blocks[i], j, old_offs, new_offs);
3c1ad06
             ri->offset[j] = htole32 (new_offs - 0x1000);
3c1ad06
-- 
3c1ad06
1.8.3.1
3c1ad06