summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYu Watanabe <watanabe.yu+github@gmail.com>2020-12-16 04:50:39 +0900
committerYu Watanabe <watanabe.yu+github@gmail.com>2020-12-16 04:56:57 +0900
commit805d67c565d57e0915162164f7e5e3026a29a2c5 (patch)
tree049251e9b467fb67f91188fcc0c9e64259502b21
parentf2bd032044ca3cd4b454dd0ba86719effcf34dc0 (diff)
downloadsystemd-805d67c565d57e0915162164f7e5e3026a29a2c5.tar.gz
logs-show: refuse data which contain invalid fields
-rw-r--r--src/shared/logs-show.c32
1 files changed, 20 insertions, 12 deletions
diff --git a/src/shared/logs-show.c b/src/shared/logs-show.c
index bf574d32a5..840f221fff 100644
--- a/src/shared/logs-show.c
+++ b/src/shared/logs-show.c
@@ -702,9 +702,11 @@ static int output_verbose(
c = memchr(data, '=', length);
if (!c)
- return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
- "Invalid field.");
+ return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Invalid field.");
+
fieldlen = c - (const char*) data;
+ if (!journal_field_valid(data, fieldlen, true))
+ return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Invalid field.");
r = field_set_test(output_fields, data, fieldlen);
if (r < 0)
@@ -798,6 +800,7 @@ static int output_export(
sd_id128_to_string(boot_id, sid));
JOURNAL_FOREACH_DATA_RETVAL(j, data, length, r) {
+ size_t fieldlen;
const char *c;
/* We already printed the boot id from the data in the header, hence let's suppress it here */
@@ -806,10 +809,13 @@ static int output_export(
c = memchr(data, '=', length);
if (!c)
- return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
- "Invalid field.");
+ return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Invalid field.");
- r = field_set_test(output_fields, data, c - (const char *) data);
+ fieldlen = c - (const char*) data;
+ if (!journal_field_valid(data, fieldlen, true))
+ return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Invalid field.");
+
+ r = field_set_test(output_fields, data, fieldlen);
if (r < 0)
return r;
if (!r)
@@ -820,11 +826,11 @@ static int output_export(
else {
uint64_t le64;
- fwrite(data, c - (const char*) data, 1, f);
+ fwrite(data, fieldlen, 1, f);
fputc('\n', f);
- le64 = htole64(length - (c - (const char*) data) - 1);
+ le64 = htole64(length - fieldlen - 1);
fwrite(&le64, sizeof(le64), 1, f);
- fwrite(c + 1, length - (c - (const char*) data) - 1, 1, f);
+ fwrite(c + 1, length - fieldlen - 1, 1, f);
}
fputc('\n', f);
@@ -961,6 +967,7 @@ static int update_json_data_split(
const void *data,
size_t size) {
+ size_t fieldlen;
const char *eq;
char *name;
@@ -974,14 +981,15 @@ static int update_json_data_split(
if (!eq)
return 0;
- if (eq == data)
- return 0;
+ fieldlen = eq - (const char*) data;
+ if (!journal_field_valid(data, fieldlen, true))
+ return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Invalid field.");
- name = strndupa(data, eq - (const char*) data);
+ name = strndupa(data, fieldlen);
if (output_fields && !set_contains(output_fields, name))
return 0;
- return update_json_data(h, flags, name, eq + 1, size - (eq - (const char*) data) - 1);
+ return update_json_data(h, flags, name, eq + 1, size - fieldlen - 1);
}
static int output_json(