summary refs log tree commit diff
path: root/lib
diff options
context:
space:
mode:
authorPetr Mladek <pmladek@suse.com>2022-03-21 14:44:49 +0100
committerPetr Mladek <pmladek@suse.com>2022-03-21 14:44:49 +0100
commit0834c6f03b0279d58718f93630206305079645da (patch)
tree4112359ab83b0864c80a3b538e278afa68f23fd2 /lib
parentb665eae7a788c5e2bc10f9ac3c0137aa0ad1fc97 (diff)
parentf74a08fc61073cc5b5f4e24eb513f0b79f4f6ce7 (diff)
downloadlinux-0834c6f03b0279d58718f93630206305079645da.tar.gz
Merge branch 'for-5.18-vsprintf-fourcc-fixup' into for-linus
Diffstat (limited to 'lib')
-rw-r--r--lib/vsprintf.c13
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';