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