util-linux/util-linux-dmesg-fix-printing-of-multibyte-characters.patch

53 lines
1.5 KiB
Diff

From 131b477b61c7eb82aef913bae5aec63f019b7076 Mon Sep 17 00:00:00 2001
From: Petr Uzel <petr.uzel@suse.cz>
Date: Tue, 1 Nov 2011 16:17:57 +0100
Subject: [PATCH] dmesg: fix printing of multibyte characters
Also make it compile if HAVE_WIDECHAR is not defined.
Addresses: https://bugzilla.novell.com/show_bug.cgi?id=725993
Reported-by: Harald Koenig <koenig@linux.de>
Signed-off-by: Petr Uzel <petr.uzel@suse.cz>
---
sys-utils/dmesg.c | 16 ++++++++--------
1 files changed, 8 insertions(+), 8 deletions(-)
Index: util-linux-2.20.1/sys-utils/dmesg.c
===================================================================
--- util-linux-2.20.1.orig/sys-utils/dmesg.c
+++ util-linux-2.20.1/sys-utils/dmesg.c
@@ -391,10 +391,11 @@ static void safe_fwrite(const char *buf,
for (i = 0; i < size; i++) {
const char *p = buf + i;
int rc, hex = 0;
+ size_t len = 1;
#ifdef HAVE_WIDECHAR
wchar_t wc;
- size_t len = mbrtowc(&wc, p, size - i, &s);
+ len = mbrtowc(&wc, p, size - i, &s);
if (len == 0) /* L'\0' */
return;
@@ -402,16 +403,15 @@ static void safe_fwrite(const char *buf,
if (len == (size_t)-1 || len == (size_t)-2) { /* invalid sequence */
memset(&s, 0, sizeof (s));
len = hex = 1;
-
} else if (len > 1 && !iswprint(wc)) { /* non-printable multibyte */
hex = 1;
- } else
-#endif
- {
+ }
+ i += len - 1;
+#else
if (!isprint((unsigned int) *p) &&
!isspace((unsigned int) *p)) /* non-printable */
hex = 1;
- }
+#endif
if (hex)
rc = fwrite_hex(p, len, out);
else