Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > linux.kernel > #1184142
| Path | csiph.com!aioe.org!bofh.it!news.nic.it!robomod |
|---|---|
| From | Horacio Mijail Anton Quiles <hmijail@gmail.com> |
| Newsgroups | linux.kernel |
| Subject | [PATCH v6] hexdump: fix for non-aligned buffers |
| Date | Wed, 15 Jul 2015 01:50:03 +0200 |
| Message-ID | <pMi7x-72M-15@gated-at.bofh.it> (permalink) |
| X-Original-To | Andrew Morton <akpm@linux-foundation.org>, Andy Shevchenko <andriy.shevchenko@linux.intel.com>, David Howells <dhowells@redhat.com>, Vivek Goyal <vgoyal@redhat.com>, linux-kernel@vger.kernel.org, trivial@kernel.org, Joe Perches <joe@perches.com>, Geert Uytterhoeven <geert@linux-m68k.org> |
| Dkim-Signature | v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=date:from:to:subject:message-id:mime-version:content-type :content-disposition:content-transfer-encoding:user-agent; bh=vGGDc5dhFBFYoE6bHol1f8LmksV2Do7LdSTbAk1Hgyo=; b=YJz3rv9wGyXOO6/c32bV1pLiKU/2JDdQTJGQfLrYxd3HerLXc2KRoFYlKCMJG3shpL ejG1kXgiw+s6kQXsv3MqIlllNYkXARA79REEpftUcr4fLxc3oJmf0iBHKTyk/bYDy42y Tc91y4dVQ2M4tqboqkC5tQupjaCxFEcjD4z7u2TBAu0iu1SuEFYxZ7HAPkuTxO11FgfY YokiPPcO+lWXAcw+YKtwYI71GLYVywCilOdmQR/TquEI+EPGOxH0vmbE6onZw+F1yWSj i6MGWl7+Xsqo9nYe+VI6ELHtg47v8rT2Jam94c+YseIC2/tqq6LH2VizjahKHsKYmrHj Um+A== |
| X-Received | by 10.152.23.38 with SMTP id j6mr1089693laf.47.1436917658862; Tue, 14 Jul 2015 16:47:38 -0700 (PDT) |
| MIME-Version | 1.0 |
| Content-Type | text/plain; charset=iso-8859-1 |
| Content-Disposition | inline |
| Content-Transfer-Encoding | 8bit |
| User-Agent | Mutt/1.5.23 (2014-03-12) |
| Sender | robomod@news.nic.it |
| List-ID | <linux-kernel.vger.kernel.org> |
| X-Mailing-List | linux-kernel@vger.kernel.org |
| Approved | robomod@news.nic.it |
| Lines | 84 |
| Organization | linux.* mail to news gateway |
| X-Original-Date | Wed, 15 Jul 2015 01:47:35 +0200 |
| X-Original-Message-ID | <20150714234735.GA31212@mija-VirtualBox> |
| X-Original-Sender | linux-kernel-owner@vger.kernel.org |
| Xref | aioe.org linux.kernel:1184142 |
Show key headers only | View raw
An hexdump with a buf not aligned to the groupsize causes
non-naturally-aligned memory accesses. This was causing a kernel panic
on the processor BlackFin BF527, when such an unaligned buffer was fed
by the function ubifs_scanned_corruption in fs/ubifs/scan.c .
To fix this, change accesses to the contents of the buffer so they go
through get_unaligned(). This change should be harmless to unaligned-
access-capable architectures, and any performance hit should be anyway
dwarfed by the snprintf() processing time.
Signed-off-by: Horacio Mijail Antón Quiles <hmijail@gmail.com>
---
Changes in v6:
- Removed unnecessary cast of u64 to unsigned long long, since
currently they are equivalent (per Geer Uytterhoeven's indication)
Changes in v5:
- Instead of trying to detect non-unaligned-capable architectures,
change all accesses to unconditionally use get_unaligned() (per
Andrew Morton's and Geert Uytterhoeven's comments)
Changes in v4:
- Added space before "*/" (per Joe Perches' indication)
Changes in v3:
- Removed trailing whitespace (per Joe Perches' indication)
- Changed mail headers to avoid encoding issues (per Joe Perches' hint)
Changes in v2:
- Changed from ad-hoc calculation to IS_ALIGNED() for readability (per
Joe Perches' indication)
- Made the explanation clearer (aligned vs naturally aligned)
---
lib/hexdump.c | 7 ++++---
1 file changed, 4 insertions(+), 3 deletions(-)
diff --git a/lib/hexdump.c b/lib/hexdump.c
index 7ea0969..8d74c20 100644
--- a/lib/hexdump.c
+++ b/lib/hexdump.c
@@ -11,6 +11,7 @@
#include <linux/ctype.h>
#include <linux/kernel.h>
#include <linux/export.h>
+#include <asm/unaligned.h>
const char hex_asc[] = "0123456789abcdef";
EXPORT_SYMBOL(hex_asc);
@@ -139,7 +140,7 @@ int hex_dump_to_buffer(const void *buf, size_t len, int rowsize, int groupsize,
for (j = 0; j < ngroups; j++) {
ret = snprintf(linebuf + lx, linebuflen - lx,
"%s%16.16llx", j ? " " : "",
- (unsigned long long)*(ptr8 + j));
+ get_unaligned(ptr8 + j));
if (ret >= linebuflen - lx)
goto overflow1;
lx += ret;
@@ -150,7 +151,7 @@ int hex_dump_to_buffer(const void *buf, size_t len, int rowsize, int groupsize,
for (j = 0; j < ngroups; j++) {
ret = snprintf(linebuf + lx, linebuflen - lx,
"%s%8.8x", j ? " " : "",
- *(ptr4 + j));
+ get_unaligned(ptr4 + j));
if (ret >= linebuflen - lx)
goto overflow1;
lx += ret;
@@ -161,7 +162,7 @@ int hex_dump_to_buffer(const void *buf, size_t len, int rowsize, int groupsize,
for (j = 0; j < ngroups; j++) {
ret = snprintf(linebuf + lx, linebuflen - lx,
"%s%4.4x", j ? " " : "",
- *(ptr2 + j));
+ get_unaligned(ptr2 + j));
if (ret >= linebuflen - lx)
goto overflow1;
lx += ret;
--
2.1.4
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
Back to linux.kernel | Previous | Next | Find similar | Unroll thread
[PATCH v6] hexdump: fix for non-aligned buffers Horacio Mijail Anton Quiles <hmijail@gmail.com> - 2015-07-15 01:50 +0200
csiph-web