Commit 0f70fe60 authored by Horacio Mijail Anton Quiles's avatar Horacio Mijail Anton Quiles Committed by Linus Torvalds

hexdump: fix for non-aligned buffers

A 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: default avatarHoracio Mijail Antón Quiles <hmijail@gmail.com>
Cc: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Cc: David Howells <dhowells@redhat.com>
Cc: Vivek Goyal <vgoyal@redhat.com>
Cc: Joe Perches <joe@perches.com>
Acked-by: default avatarGeert Uytterhoeven <geert@linux-m68k.org>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent b4749e96
...@@ -11,6 +11,7 @@ ...@@ -11,6 +11,7 @@
#include <linux/ctype.h> #include <linux/ctype.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/export.h> #include <linux/export.h>
#include <asm/unaligned.h>
const char hex_asc[] = "0123456789abcdef"; const char hex_asc[] = "0123456789abcdef";
EXPORT_SYMBOL(hex_asc); EXPORT_SYMBOL(hex_asc);
...@@ -139,7 +140,7 @@ int hex_dump_to_buffer(const void *buf, size_t len, int rowsize, int groupsize, ...@@ -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++) { for (j = 0; j < ngroups; j++) {
ret = snprintf(linebuf + lx, linebuflen - lx, ret = snprintf(linebuf + lx, linebuflen - lx,
"%s%16.16llx", j ? " " : "", "%s%16.16llx", j ? " " : "",
(unsigned long long)*(ptr8 + j)); get_unaligned(ptr8 + j));
if (ret >= linebuflen - lx) if (ret >= linebuflen - lx)
goto overflow1; goto overflow1;
lx += ret; lx += ret;
...@@ -150,7 +151,7 @@ int hex_dump_to_buffer(const void *buf, size_t len, int rowsize, int groupsize, ...@@ -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++) { for (j = 0; j < ngroups; j++) {
ret = snprintf(linebuf + lx, linebuflen - lx, ret = snprintf(linebuf + lx, linebuflen - lx,
"%s%8.8x", j ? " " : "", "%s%8.8x", j ? " " : "",
*(ptr4 + j)); get_unaligned(ptr4 + j));
if (ret >= linebuflen - lx) if (ret >= linebuflen - lx)
goto overflow1; goto overflow1;
lx += ret; lx += ret;
...@@ -161,7 +162,7 @@ int hex_dump_to_buffer(const void *buf, size_t len, int rowsize, int groupsize, ...@@ -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++) { for (j = 0; j < ngroups; j++) {
ret = snprintf(linebuf + lx, linebuflen - lx, ret = snprintf(linebuf + lx, linebuflen - lx,
"%s%4.4x", j ? " " : "", "%s%4.4x", j ? " " : "",
*(ptr2 + j)); get_unaligned(ptr2 + j));
if (ret >= linebuflen - lx) if (ret >= linebuflen - lx)
goto overflow1; goto overflow1;
lx += ret; lx += ret;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment