xfs
[Top] [All Lists]

[PATCH 3/4] xfs_logprint: fix some unaligned accesses

To: xfs@xxxxxxxxxxx
Subject: [PATCH 3/4] xfs_logprint: fix some unaligned accesses
From: Eric Sandeen <sandeen@xxxxxxxxxxx>
Date: Thu, 8 Oct 2015 19:25:50 -0500
Delivered-to: xfs@xxxxxxxxxxx
In-reply-to: <56170906.5090301@xxxxxxxxxx>
References: <56170906.5090301@xxxxxxxxxx>
User-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:38.0) Gecko/20100101 Thunderbird/38.3.0
This routine had a fair bit of gyration to avoid unaligned accesses,
but didn't fix them all.  Fix some more spotted at runtime by libubsan.

Signed-off-by: Eric Sandeen <sandeen@xxxxxxxxxx>
---
 logprint/log_misc.c |   18 +++++++++++++++---
 repair/btree.c      |    1 +
 2 files changed, 16 insertions(+), 3 deletions(-)

diff --git a/logprint/log_misc.c b/logprint/log_misc.c
index d76145c..6cd249a 100644
--- a/logprint/log_misc.c
+++ b/logprint/log_misc.c
@@ -325,7 +325,11 @@ xlog_print_trans_buffer(char **ptr, int len, int *i, int 
num_ops)
                }
                super_block = 0;
        } else if (be32_to_cpu(*(__be32 *)(*ptr)) == XFS_AGI_MAGIC) {
-               agi = (xfs_agi_t *)(*ptr);
+               struct xfs_agi agi_s;
+
+               /* memmove because *ptr may not be 8-byte aligned */
+               memmove(&agi_s, *ptr, sizeof(struct xfs_agi));
+               agi = &agi_s;
                printf(_("AGI Buffer: XAGI  "));
                /*
                 * v4 filesystems only contain the fields before the uuid.
@@ -375,7 +379,11 @@ xlog_print_trans_buffer(char **ptr, int len, int *i, int 
num_ops)
                        }
                }
        } else if (be32_to_cpu(*(__be32 *)(*ptr)) == XFS_AGF_MAGIC) {
-               agf = (xfs_agf_t *)(*ptr);
+               struct xfs_agf agf_s;
+
+               /* memmove because *ptr may not be 8-byte aligned */
+               memmove(&agf_s, *ptr, sizeof(struct xfs_agf));
+               agf = &agf_s;
                printf(_("AGF Buffer: XAGF  "));
                /*
                 * v4 filesystems only contain the fields before the uuid.
@@ -408,7 +416,11 @@ xlog_print_trans_buffer(char **ptr, int len, int *i, int 
num_ops)
                                be32_to_cpu(agf->agf_longest));
                }
        } else if (be32_to_cpu(*(__be32 *)(*ptr)) == XFS_DQUOT_MAGIC) {
-               dq = (xfs_disk_dquot_t *)(*ptr);
+               struct xfs_disk_dquot dq_s;
+
+               /* memmove because *ptr may not be 8-byte aligned */
+               memmove(&dq_s, *ptr, sizeof(struct xfs_disk_dquot));
+               dq = &dq_s;
                printf(_("DQUOT Buffer: DQ  "));
                if (be32_to_cpu(head->oh_len) <
                                sizeof(xfs_disk_dquot_t)) {
diff --git a/repair/btree.c b/repair/btree.c
index 66fb40b..e31e67a 100644
--- a/repair/btree.c
+++ b/repair/btree.c
@@ -230,6 +230,7 @@ btree_get_next(
        }
        if (level == 0) {
                if (key) {
+               /* XXXX what if index past MAX?  What if no next? */
                        cur->index++;
                        *key = btree_key_of_cursor(cur, root->height);
                        cur->index--;
-- 
1.7.1

<Prev in Thread] Current Thread [Next in Thread>