Zbigniew Jędrzejewski-Szmek 4f9456
From 6d51d26faebae113af72d95913e2c864b4cade3f Mon Sep 17 00:00:00 2001
Zbigniew Jędrzejewski-Szmek 4f9456
From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl>
Zbigniew Jędrzejewski-Szmek 4f9456
Date: Mon, 31 Mar 2014 08:57:28 -0400
Zbigniew Jędrzejewski-Szmek 4f9456
Subject: [PATCH] journal: fix export of messages containing newlines
Zbigniew Jędrzejewski-Szmek 4f9456
Zbigniew Jędrzejewski-Szmek 4f9456
In "export" format, newlines are significant, and messages containing
Zbigniew Jędrzejewski-Szmek 4f9456
newlines must be exported as "binary".
Zbigniew Jędrzejewski-Szmek 4f9456
Zbigniew Jędrzejewski-Szmek 4f9456
(cherry picked from commit 0ade5ffe2778e7b238bba8d979ca4d53dee1e702)
Zbigniew Jędrzejewski-Szmek 4f9456
(cherry picked from commit 0fa79586f73bddf872b8e3bb5af4c9926cb84d41)
Zbigniew Jędrzejewski-Szmek 4f9456
---
Zbigniew Jędrzejewski-Szmek 4f9456
 src/shared/logs-show.c | 7 ++++---
Zbigniew Jędrzejewski-Szmek 4f9456
 src/shared/utf8.c      | 5 +++--
Zbigniew Jędrzejewski-Szmek 4f9456
 src/shared/utf8.h      | 5 ++++-
Zbigniew Jędrzejewski-Szmek 4f9456
 3 files changed, 11 insertions(+), 6 deletions(-)
Zbigniew Jędrzejewski-Szmek 4f9456
Zbigniew Jędrzejewski-Szmek 4f9456
diff --git a/src/shared/logs-show.c b/src/shared/logs-show.c
Zbigniew Jędrzejewski-Szmek 1cc3df
index 91eefb32bd..00e6d11bd3 100644
Zbigniew Jędrzejewski-Szmek 4f9456
--- a/src/shared/logs-show.c
Zbigniew Jędrzejewski-Szmek 4f9456
+++ b/src/shared/logs-show.c
Zbigniew Jędrzejewski-Szmek 4f9456
@@ -544,7 +544,9 @@ static int output_export(
Zbigniew Jędrzejewski-Szmek 4f9456
                     startswith(data, "_BOOT_ID="))
Zbigniew Jędrzejewski-Szmek 4f9456
                         continue;
Zbigniew Jędrzejewski-Szmek 4f9456
 
Zbigniew Jędrzejewski-Szmek 4f9456
-                if (!utf8_is_printable(data, length)) {
Zbigniew Jędrzejewski-Szmek 4f9456
+                if (utf8_is_printable_newline(data, length, false))
Zbigniew Jędrzejewski-Szmek 4f9456
+                        fwrite(data, length, 1, f);
Zbigniew Jędrzejewski-Szmek 4f9456
+                else {
Zbigniew Jędrzejewski-Szmek 4f9456
                         const char *c;
Zbigniew Jędrzejewski-Szmek 4f9456
                         uint64_t le64;
Zbigniew Jędrzejewski-Szmek 4f9456
 
Zbigniew Jędrzejewski-Szmek 4f9456
@@ -559,8 +561,7 @@ static int output_export(
Zbigniew Jędrzejewski-Szmek 4f9456
                         le64 = htole64(length - (c - (const char*) data) - 1);
Zbigniew Jędrzejewski-Szmek 4f9456
                         fwrite(&le64, sizeof(le64), 1, f);
Zbigniew Jędrzejewski-Szmek 4f9456
                         fwrite(c + 1, length - (c - (const char*) data) - 1, 1, f);
Zbigniew Jędrzejewski-Szmek 4f9456
-                } else
Zbigniew Jędrzejewski-Szmek 4f9456
-                        fwrite(data, length, 1, f);
Zbigniew Jędrzejewski-Szmek 4f9456
+                }
Zbigniew Jędrzejewski-Szmek 4f9456
 
Zbigniew Jędrzejewski-Szmek 4f9456
                 fputc('\n', f);
Zbigniew Jędrzejewski-Szmek 4f9456
         }
Zbigniew Jędrzejewski-Szmek 4f9456
diff --git a/src/shared/utf8.c b/src/shared/utf8.c
Zbigniew Jędrzejewski-Szmek 1cc3df
index 2b70d45e97..15605e6002 100644
Zbigniew Jędrzejewski-Szmek 4f9456
--- a/src/shared/utf8.c
Zbigniew Jędrzejewski-Szmek 4f9456
+++ b/src/shared/utf8.c
Zbigniew Jędrzejewski-Szmek 4f9456
@@ -136,7 +136,7 @@ static int utf8_encoded_to_unichar(const char *str) {
Zbigniew Jędrzejewski-Szmek 4f9456
         return unichar;
Zbigniew Jędrzejewski-Szmek 4f9456
 }
Zbigniew Jędrzejewski-Szmek 4f9456
 
Zbigniew Jędrzejewski-Szmek 4f9456
-bool utf8_is_printable(const char* str, size_t length) {
Zbigniew Jędrzejewski-Szmek 4f9456
+bool utf8_is_printable_newline(const char* str, size_t length, bool newline) {
Zbigniew Jędrzejewski-Szmek 4f9456
         const uint8_t *p;
Zbigniew Jędrzejewski-Szmek 4f9456
 
Zbigniew Jędrzejewski-Szmek 4f9456
         assert(str);
Zbigniew Jędrzejewski-Szmek 4f9456
@@ -145,7 +145,8 @@ bool utf8_is_printable(const char* str, size_t length) {
Zbigniew Jędrzejewski-Szmek 4f9456
                 int encoded_len = utf8_encoded_valid_unichar((const char *)p);
Zbigniew Jędrzejewski-Szmek 4f9456
                 int val = utf8_encoded_to_unichar((const char*)p);
Zbigniew Jędrzejewski-Szmek 4f9456
 
Zbigniew Jędrzejewski-Szmek 4f9456
-                if (encoded_len < 0 || val < 0 || is_unicode_control(val))
Zbigniew Jędrzejewski-Szmek 4f9456
+                if (encoded_len < 0 || val < 0 || is_unicode_control(val) ||
Zbigniew Jędrzejewski-Szmek 4f9456
+                    (!newline && val == '\n'))
Zbigniew Jędrzejewski-Szmek 4f9456
                         return false;
Zbigniew Jędrzejewski-Szmek 4f9456
 
Zbigniew Jędrzejewski-Szmek 4f9456
                 length -= encoded_len;
Zbigniew Jędrzejewski-Szmek 4f9456
diff --git a/src/shared/utf8.h b/src/shared/utf8.h
Zbigniew Jędrzejewski-Szmek 1cc3df
index f93dfb8676..b14709aedc 100644
Zbigniew Jędrzejewski-Szmek 4f9456
--- a/src/shared/utf8.h
Zbigniew Jędrzejewski-Szmek 4f9456
+++ b/src/shared/utf8.h
Zbigniew Jędrzejewski-Szmek 4f9456
@@ -31,7 +31,10 @@ const char *utf8_is_valid(const char *s) _pure_;
Zbigniew Jędrzejewski-Szmek 4f9456
 char *ascii_is_valid(const char *s) _pure_;
Zbigniew Jędrzejewski-Szmek 4f9456
 char *utf8_escape_invalid(const char *s);
Zbigniew Jędrzejewski-Szmek 4f9456
 
Zbigniew Jędrzejewski-Szmek 4f9456
-bool utf8_is_printable(const char* str, size_t length) _pure_;
Zbigniew Jędrzejewski-Szmek 4f9456
+bool utf8_is_printable_newline(const char* str, size_t length, bool newline) _pure_;
Zbigniew Jędrzejewski-Szmek 4f9456
+_pure_ static inline bool utf8_is_printable(const char* str, size_t length) {
Zbigniew Jędrzejewski-Szmek 4f9456
+        return utf8_is_printable_newline(str, length, true);
Zbigniew Jędrzejewski-Szmek 4f9456
+}
Zbigniew Jędrzejewski-Szmek 4f9456
 
Zbigniew Jędrzejewski-Szmek 4f9456
 char *ascii_filter(const char *s);
Zbigniew Jędrzejewski-Szmek 4f9456