95 lines
13 KiB
Diff
95 lines
13 KiB
Diff
From 9791614057fe7fc72babd78708fdd07857fef9cf Mon Sep 17 00:00:00 2001
|
|
From: Martin Liska <mliska@suse.cz>
|
|
Date: Wed, 10 Aug 2022 10:06:55 +0200
|
|
Subject: [PATCH] Fix fgets(..., size=1)
|
|
|
|
I noticed the following 2 tests are failing with -O1
|
|
-D_FORTIFY_SOURCE=1:
|
|
|
|
[ 44s] FAILED: whitespace-1.out: unifdef -DFOO whitespace.c
|
|
[ 44s] FAILED: whitespace-2.out: unifdef -DBAR whitespace.c
|
|
|
|
It's caused by fact that:
|
|
|
|
fgets returns '\0' if n == 1:
|
|
|
|
char *
|
|
_IO_fgets (char *buf, int n, FILE *fp)
|
|
{
|
|
size_t count;
|
|
char *result;
|
|
int old_error;
|
|
CHECK_FILE (fp, NULL);
|
|
if (n <= 0)
|
|
return NULL;
|
|
if (__glibc_unlikely (n == 1))
|
|
{
|
|
/* Another irregular case: since we have to store a NUL byte and
|
|
there is only room for exactly one byte, we don't have to
|
|
read anything. */
|
|
buf[0] = '\0';
|
|
return buf;
|
|
}
|
|
---
|
|
tests/whitespace-1.experr | 2 --
|
|
tests/whitespace-1.expout | 5 +++++
|
|
tests/whitespace-1.exprc | 2 +-
|
|
tests/whitespace-2.expout | 3 ++-
|
|
unifdef.c | 3 ++-
|
|
5 files changed, 10 insertions(+), 5 deletions(-)
|
|
|
|
diff --git a/tests/whitespace-1.experr b/tests/whitespace-1.experr
|
|
index cb23fce..e69de29 100644
|
|
--- a/tests/whitespace-1.experr
|
|
+++ b/tests/whitespace-1.experr
|
|
@@ -1,2 +0,0 @@
|
|
-unifdef: whitespace.c: 4: Obfuscated preprocessor control line (#if line 1 depth 1)
|
|
-unifdef: Output may be truncated
|
|
diff --git a/tests/whitespace-1.expout b/tests/whitespace-1.expout
|
|
index 257cc56..14dd150 100644
|
|
--- a/tests/whitespace-1.expout
|
|
+++ b/tests/whitespace-1.expout
|
|
@@ -1 +1,6 @@
|
|
foo
|
|
+ //spong
|
|
+
|
|
+#ifdef BAR
|
|
+bar
|
|
+#endif
|
|
diff --git a/tests/whitespace-1.exprc b/tests/whitespace-1.exprc
|
|
index 0cfbf08..d00491f 100644
|
|
--- a/tests/whitespace-1.exprc
|
|
+++ b/tests/whitespace-1.exprc
|
|
@@ -1 +1 @@
|
|
-2
|
|
+1
|
|
diff --git a/tests/whitespace-2.expout b/tests/whitespace-2.expout
|
|
index 84cabfe..43f6399 100644
|
|
--- a/tests/whitespace-2.expout
|
|
+++ b/tests/whitespace-2.expout
|
|
@@ -1,5 +1,6 @@
|
|
#ifdef FOO
|
|
foo
|
|
-#endif //spong
|
|
+#endif
|
|
+ //spong
|
|
|
|
bar
|
|
diff --git a/unifdef.c b/unifdef.c
|
|
index dc145a2..b7335aa 100644
|
|
--- a/unifdef.c
|
|
+++ b/unifdef.c
|
|
@@ -846,7 +846,8 @@ parseline(void)
|
|
newline or if there is too much whitespace in a directive */
|
|
if (linestate == LS_HASH) {
|
|
long len = cp - tline;
|
|
- if (fgets(tline + len, MAXLINE - len, input) == NULL) {
|
|
+ const char *line = fgets(tline + len, MAXLINE - len, input);
|
|
+ if (line == NULL || *line == '\0') {
|
|
if (ferror(input))
|
|
err(2, "can't read %s", filename);
|
|
debug("parser insert newline at EOF", linenum);
|
|
--
|
|
2.37.1
|
|
|