diff options
author | Petr Mladek <pmladek@suse.com> | 2022-03-21 14:44:49 +0100 |
---|---|---|
committer | Petr Mladek <pmladek@suse.com> | 2022-03-21 14:44:49 +0100 |
commit | 0834c6f03b0279d58718f93630206305079645da (patch) | |
tree | 4112359ab83b0864c80a3b538e278afa68f23fd2 /lib | |
parent | b665eae7a788c5e2bc10f9ac3c0137aa0ad1fc97 (diff) | |
parent | f74a08fc61073cc5b5f4e24eb513f0b79f4f6ce7 (diff) |
Merge branch 'for-5.18-vsprintf-fourcc-fixup' into for-linus
Diffstat (limited to 'lib')
-rw-r--r-- | lib/vsprintf.c | 13 |
1 files changed, 8 insertions, 5 deletions
diff --git a/lib/vsprintf.c b/lib/vsprintf.c index 8fb4a21c0b60..51495c1aceb8 100644 --- a/lib/vsprintf.c +++ b/lib/vsprintf.c @@ -49,6 +49,7 @@ #include <asm/page.h> /* for PAGE_SIZE */ #include <asm/byteorder.h> /* cpu_to_le16 */ +#include <asm/unaligned.h> #include <linux/string_helpers.h> #include "kstrtox.h" @@ -1788,7 +1789,7 @@ char *fourcc_string(char *buf, char *end, const u32 *fourcc, char output[sizeof("0123 little-endian (0x01234567)")]; char *p = output; unsigned int i; - u32 val; + u32 orig, val; if (fmt[1] != 'c' || fmt[2] != 'c') return error_string(buf, end, "(%p4?)", spec); @@ -1796,21 +1797,23 @@ char *fourcc_string(char *buf, char *end, const u32 *fourcc, if (check_pointer(&buf, end, fourcc, spec)) return buf; - val = *fourcc & ~BIT(31); + orig = get_unaligned(fourcc); + val = orig & ~BIT(31); - for (i = 0; i < sizeof(*fourcc); i++) { + for (i = 0; i < sizeof(u32); i++) { unsigned char c = val >> (i * 8); /* Print non-control ASCII characters as-is, dot otherwise */ *p++ = isascii(c) && isprint(c) ? c : '.'; } - strcpy(p, *fourcc & BIT(31) ? " big-endian" : " little-endian"); + *p++ = ' '; + strcpy(p, orig & BIT(31) ? "big-endian" : "little-endian"); p += strlen(p); *p++ = ' '; *p++ = '('; - p = special_hex_number(p, output + sizeof(output) - 2, *fourcc, sizeof(u32)); + p = special_hex_number(p, output + sizeof(output) - 2, orig, sizeof(u32)); *p++ = ')'; *p = '\0'; |