67 lines
1.9 KiB
Diff
67 lines
1.9 KiB
Diff
From 72f783d0ea5297e3fab22a93574aa63f421c5f69 Mon Sep 17 00:00:00 2001
|
|
From: Karel Zak <kzak@redhat.com>
|
|
Date: Mon, 17 Aug 2020 16:33:59 +0200
|
|
Subject: [PATCH] libmount: fix tab parser for badly terminated lines
|
|
|
|
Signed-off-by: Karel Zak <kzak@redhat.com>
|
|
---
|
|
libmount/src/tab_parse.c | 26 +++++++++++---------------
|
|
1 file changed, 11 insertions(+), 15 deletions(-)
|
|
|
|
diff --git a/libmount/src/tab_parse.c b/libmount/src/tab_parse.c
|
|
index fa2d31b81..329987bcb 100644
|
|
--- a/libmount/src/tab_parse.c
|
|
+++ b/libmount/src/tab_parse.c
|
|
@@ -481,7 +481,7 @@ static int is_terminated_by_blank(const char *str)
|
|
if (p == str)
|
|
return 1; /* only '\n' */
|
|
p--;
|
|
- while (p >= str && (*p == ' ' || *p == '\t'))
|
|
+ while (p > str && (*p == ' ' || *p == '\t'))
|
|
p--;
|
|
return *p == '\n' ? 1 : 0;
|
|
}
|
|
@@ -553,22 +553,16 @@ static int mnt_table_parse_next(struct libmnt_parser *pa,
|
|
pa->line++;
|
|
s = strchr(pa->buf, '\n');
|
|
if (!s) {
|
|
+ DBG(TAB, ul_debugobj(tb, "%s:%zu: no final newline",
|
|
+ pa->filename, pa->line));
|
|
+
|
|
/* Missing final newline? Otherwise an extremely */
|
|
/* long line - assume file was corrupted */
|
|
- if (feof(pa->f)) {
|
|
- DBG(TAB, ul_debugobj(tb,
|
|
- "%s: no final newline", pa->filename));
|
|
- s = strchr(pa->buf, '\0');
|
|
- } else {
|
|
- DBG(TAB, ul_debugobj(tb,
|
|
- "%s:%zu: missing newline at line",
|
|
- pa->filename, pa->line));
|
|
- goto err;
|
|
- }
|
|
- }
|
|
+ if (feof(pa->f))
|
|
+ s = memchr(pa->buf, '\0', pa->bufsiz);
|
|
|
|
/* comments parser */
|
|
- if (tb->comms
|
|
+ } else if (tb->comms
|
|
&& (tb->fmt == MNT_FMT_GUESS || tb->fmt == MNT_FMT_FSTAB)
|
|
&& is_comment_line(pa->buf)) {
|
|
do {
|
|
@@ -584,9 +578,11 @@ static int mnt_table_parse_next(struct libmnt_parser *pa,
|
|
|
|
}
|
|
|
|
+ if (!s)
|
|
+ goto err;
|
|
*s = '\0';
|
|
- if (--s >= pa->buf && *s == '\r')
|
|
- *s = '\0';
|
|
+ if (s > pa->buf && *(s - 1) == '\r')
|
|
+ *(--s) = '\0';
|
|
s = (char *) skip_blank(pa->buf);
|
|
} while (*s == '\0' || *s == '#');
|
|
|