xfs
[Top] [All Lists]

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

To: xfs@xxxxxxxxxxx
Subject: [PATCH 3/5] xfs_logprint: fix some unaligned accesses
From: Eric Sandeen <sandeen@xxxxxxxxxxx>
Date: Fri, 9 Oct 2015 14:52:16 -0500
Delivered-to: xfs@xxxxxxxxxxx
In-reply-to: <56181A17.9080503@xxxxxxxxxxx>
References: <56181A17.9080503@xxxxxxxxxxx>
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>
---

V2: Change variable scope, remove extraneous hunk

 logprint/log_misc.c | 21 +++++++++++++++------
 1 file changed, 15 insertions(+), 6 deletions(-)

diff --git a/logprint/log_misc.c b/logprint/log_misc.c
index d76145c..4cdcbec 100644
--- a/logprint/log_misc.c
+++ b/logprint/log_misc.c
@@ -243,9 +243,6 @@ int
 xlog_print_trans_buffer(char **ptr, int len, int *i, int num_ops)
 {
     xfs_buf_log_format_t *f;
-    xfs_agi_t           *agi;
-    xfs_agf_t           *agf;
-    xfs_disk_dquot_t    *dq;
     xlog_op_header_t    *head = NULL;
     int                         num, skip;
     int                         super_block = 0;
@@ -325,7 +322,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, agi_s;
+
+               /* memmove because *ptr may not be 8-byte aligned */
+               agi = &agi_s;
+               memmove(agi, *ptr, sizeof(struct xfs_agi));
                printf(_("AGI Buffer: XAGI  "));
                /*
                 * v4 filesystems only contain the fields before the uuid.
@@ -375,7 +376,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, agf_s;
+
+               /* memmove because *ptr may not be 8-byte aligned */
+               agf = &agf_s;
+               memmove(agf, *ptr, sizeof(struct xfs_agf));
                printf(_("AGF Buffer: XAGF  "));
                /*
                 * v4 filesystems only contain the fields before the uuid.
@@ -408,7 +413,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, dq_s;
+
+               /* memmove because *ptr may not be 8-byte aligned */
+               dq = &dq_s;
+               memmove(dq, *ptr, sizeof(struct xfs_disk_dquot));
                printf(_("DQUOT Buffer: DQ  "));
                if (be32_to_cpu(head->oh_len) <
                                sizeof(xfs_disk_dquot_t)) {
-- 
2.6.1


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