util-linux/fix-size-use-for-stdin.patch
shangyibin 7ec1c7315a realloc buffer when header size changed
fix size use for stdin
segmentation fault on invalid unicode input passed to -s option
cherry-pick from: a3a782806687d4c1569e0cc8046c21ba987d263a
2022-10-31 19:42:24 +08:00

62 lines
1.9 KiB
Diff
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

From 58e4ee082bca100034791a4a74481f263bb30a25 Mon Sep 17 00:00:00 2001
From: Karel Zak <kzak@redhat.com>
Date: Thu, 21 Oct 2021 18:47:40 +0200
Subject: [PATCH] logger: fix --size use for stdin
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
The stdin version counts log header into the message size, but
for example when it reads message from argv[] it counts only message
itself.
$ logger --stderr --size 3 "abcd"
<13>Oct 21 18:48:29 kzak: abc
$ echo "abcd" | logger --stderr --size 3
logger: cannot allocate 18446744073709551597 bytes: Cannot allocate memory
Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=2011602
Signed-off-by: Karel Zak <kzak@redhat.com>
---
misc-utils/logger.c | 13 ++-----------
1 file changed, 2 insertions(+), 11 deletions(-)
diff --git a/misc-utils/logger.c b/misc-utils/logger.c
index 25ff2b9308..50ae211056 100644
--- a/misc-utils/logger.c
+++ b/misc-utils/logger.c
@@ -976,9 +976,7 @@ static void logger_stdin(struct logger_ctl *ctl)
*/
int default_priority = ctl->pri;
int last_pri = default_priority;
- size_t max_usrmsg_size = ctl->max_message_size - strlen(ctl->hdr);
- size_t allocated_usrmsg_size = max_usrmsg_size;
- char *buf = xmalloc(allocated_usrmsg_size + 2 + 2);
+ char *buf = xmalloc(ctl->max_message_size + 2 + 2);
int pri;
int c;
size_t i;
@@ -1006,20 +1004,13 @@ static void logger_stdin(struct logger_ctl *ctl)
if (ctl->pri != last_pri) {
generate_syslog_header(ctl);
- max_usrmsg_size = ctl->max_message_size - strlen(ctl->hdr);
-
- if (max_usrmsg_size > allocated_usrmsg_size) {
- allocated_usrmsg_size = max_usrmsg_size;
- buf = xrealloc(buf, allocated_usrmsg_size + 2 + 2);
- }
-
last_pri = ctl->pri;
}
if (c != EOF && c != '\n')
c = getchar();
}
- while (c != EOF && c != '\n' && i < max_usrmsg_size) {
+ while (c != EOF && c != '\n' && i < ctl->max_message_size) {
buf[i++] = c;
c = getchar();
}