|
|
4b8c80 |
From a9e1b3a33f65721e7f77f8d8253512dd16cbafdb Mon Sep 17 00:00:00 2001
|
|
|
4b8c80 |
From: Yu Watanabe <watanabe.yu+github@gmail.com>
|
|
|
4b8c80 |
Date: Wed, 8 Aug 2018 18:27:15 +0900
|
|
|
4b8c80 |
Subject: [PATCH] syslog: fix segfault in syslog_parse_priority()
|
|
|
4b8c80 |
|
|
|
4b8c80 |
(cherry picked from commit a5ee33b951cfa22db53d0274c9c6c0d9d4dae39d)
|
|
|
4b8c80 |
(cherry picked from commit 8bd791fb3a8e85063e297204bdef8004aacd22b1)
|
|
|
4b8c80 |
Related: #1781712
|
|
|
4b8c80 |
---
|
|
|
4b8c80 |
src/basic/syslog-util.c | 20 +++++++++++---------
|
|
|
4b8c80 |
src/journal/test-journal-syslog.c | 20 ++++++++++++++++++++
|
|
|
4b8c80 |
2 files changed, 31 insertions(+), 9 deletions(-)
|
|
|
4b8c80 |
|
|
|
4b8c80 |
diff --git a/src/basic/syslog-util.c b/src/basic/syslog-util.c
|
|
|
4b8c80 |
index 21461fa581..fe129482f3 100644
|
|
|
4b8c80 |
--- a/src/basic/syslog-util.c
|
|
|
4b8c80 |
+++ b/src/basic/syslog-util.c
|
|
|
4b8c80 |
@@ -10,7 +10,8 @@
|
|
|
4b8c80 |
|
|
|
4b8c80 |
int syslog_parse_priority(const char **p, int *priority, bool with_facility) {
|
|
|
4b8c80 |
int a = 0, b = 0, c = 0;
|
|
|
4b8c80 |
- int k;
|
|
|
4b8c80 |
+ const char *end;
|
|
|
4b8c80 |
+ size_t k;
|
|
|
4b8c80 |
|
|
|
4b8c80 |
assert(p);
|
|
|
4b8c80 |
assert(*p);
|
|
|
4b8c80 |
@@ -19,21 +20,22 @@ int syslog_parse_priority(const char **p, int *priority, bool with_facility) {
|
|
|
4b8c80 |
if ((*p)[0] != '<')
|
|
|
4b8c80 |
return 0;
|
|
|
4b8c80 |
|
|
|
4b8c80 |
- if (!strchr(*p, '>'))
|
|
|
4b8c80 |
+ end = strchr(*p, '>');
|
|
|
4b8c80 |
+ if (!end)
|
|
|
4b8c80 |
return 0;
|
|
|
4b8c80 |
|
|
|
4b8c80 |
- if ((*p)[2] == '>') {
|
|
|
4b8c80 |
+ k = end - *p;
|
|
|
4b8c80 |
+ assert(k > 0);
|
|
|
4b8c80 |
+
|
|
|
4b8c80 |
+ if (k == 2)
|
|
|
4b8c80 |
c = undecchar((*p)[1]);
|
|
|
4b8c80 |
- k = 3;
|
|
|
4b8c80 |
- } else if ((*p)[3] == '>') {
|
|
|
4b8c80 |
+ else if (k == 3) {
|
|
|
4b8c80 |
b = undecchar((*p)[1]);
|
|
|
4b8c80 |
c = undecchar((*p)[2]);
|
|
|
4b8c80 |
- k = 4;
|
|
|
4b8c80 |
- } else if ((*p)[4] == '>') {
|
|
|
4b8c80 |
+ } else if (k == 4) {
|
|
|
4b8c80 |
a = undecchar((*p)[1]);
|
|
|
4b8c80 |
b = undecchar((*p)[2]);
|
|
|
4b8c80 |
c = undecchar((*p)[3]);
|
|
|
4b8c80 |
- k = 5;
|
|
|
4b8c80 |
} else
|
|
|
4b8c80 |
return 0;
|
|
|
4b8c80 |
|
|
|
4b8c80 |
@@ -46,7 +48,7 @@ int syslog_parse_priority(const char **p, int *priority, bool with_facility) {
|
|
|
4b8c80 |
else
|
|
|
4b8c80 |
*priority = (*priority & LOG_FACMASK) | c;
|
|
|
4b8c80 |
|
|
|
4b8c80 |
- *p += k;
|
|
|
4b8c80 |
+ *p += k + 1;
|
|
|
4b8c80 |
return 1;
|
|
|
4b8c80 |
}
|
|
|
4b8c80 |
|
|
|
4b8c80 |
diff --git a/src/journal/test-journal-syslog.c b/src/journal/test-journal-syslog.c
|
|
|
4b8c80 |
index 7294cde032..120477cc9f 100644
|
|
|
4b8c80 |
--- a/src/journal/test-journal-syslog.c
|
|
|
4b8c80 |
+++ b/src/journal/test-journal-syslog.c
|
|
|
4b8c80 |
@@ -4,6 +4,7 @@
|
|
|
4b8c80 |
#include "journald-syslog.h"
|
|
|
4b8c80 |
#include "macro.h"
|
|
|
4b8c80 |
#include "string-util.h"
|
|
|
4b8c80 |
+#include "syslog-util.h"
|
|
|
4b8c80 |
|
|
|
4b8c80 |
static void test_syslog_parse_identifier(const char *str,
|
|
|
4b8c80 |
const char *ident, const char *pid, const char *rest, int ret) {
|
|
|
4b8c80 |
@@ -19,6 +20,17 @@ static void test_syslog_parse_identifier(const char *str,
|
|
|
4b8c80 |
assert_se(streq(buf, rest));
|
|
|
4b8c80 |
}
|
|
|
4b8c80 |
|
|
|
4b8c80 |
+static void test_syslog_parse_priority(const char *str, int priority, int ret) {
|
|
|
4b8c80 |
+ const char *buf = str;
|
|
|
4b8c80 |
+ int priority2, ret2;
|
|
|
4b8c80 |
+
|
|
|
4b8c80 |
+ ret2 = syslog_parse_priority(&buf, &priority2, false);
|
|
|
4b8c80 |
+
|
|
|
4b8c80 |
+ assert_se(ret == ret2);
|
|
|
4b8c80 |
+ if (ret2 == 1)
|
|
|
4b8c80 |
+ assert_se(priority == priority2);
|
|
|
4b8c80 |
+}
|
|
|
4b8c80 |
+
|
|
|
4b8c80 |
int main(void) {
|
|
|
4b8c80 |
test_syslog_parse_identifier("pidu[111]: xxx", "pidu", "111", "xxx", 11);
|
|
|
4b8c80 |
test_syslog_parse_identifier("pidu: xxx", "pidu", NULL, "xxx", 6);
|
|
|
4b8c80 |
@@ -33,5 +45,13 @@ int main(void) {
|
|
|
4b8c80 |
test_syslog_parse_identifier("pidu: ", "pidu", NULL, "", 6);
|
|
|
4b8c80 |
test_syslog_parse_identifier("pidu : ", NULL, NULL, "pidu : ", 0);
|
|
|
4b8c80 |
|
|
|
4b8c80 |
+ test_syslog_parse_priority("<>", 0, 0);
|
|
|
4b8c80 |
+ test_syslog_parse_priority("<>aaa", 0, 0);
|
|
|
4b8c80 |
+ test_syslog_parse_priority("<aaaa>", 0, 0);
|
|
|
4b8c80 |
+ test_syslog_parse_priority("<aaaa>aaa", 0, 0);
|
|
|
4b8c80 |
+ test_syslog_parse_priority(" <aaaa>", 0, 0);
|
|
|
4b8c80 |
+ test_syslog_parse_priority(" <aaaa>aaa", 0, 0);
|
|
|
4b8c80 |
+ /* TODO: add test cases of valid priorities */
|
|
|
4b8c80 |
+
|
|
|
4b8c80 |
return 0;
|
|
|
4b8c80 |
}
|