Working xgets with long lines

* previously, the long line led to infinite loop
 * now we get warning in /var/log/secure (and line is ignored)
This commit is contained in:
Jakub Jelen 2016-02-23 17:47:09 +01:00
parent 17e25d186e
commit cb31af92a4
1 changed files with 41 additions and 4 deletions

View File

@ -1,12 +1,49 @@
diff -up tcp_wrappers_7.6/misc.c.xgets tcp_wrappers_7.6/misc.c
--- tcp_wrappers_7.6/misc.c.xgets 2011-08-15 05:50:26.403091995 -0400
+++ tcp_wrappers_7.6/misc.c 2011-08-15 05:51:02.289091985 -0400
@@ -35,7 +35,7 @@ FILE *fp;
commit 3ae65dc9a1c78c3088a08091f5d948fbbb8929af
Author: Jakub Jelen <jjelen@redhat.com>
Date: Tue Feb 23 17:28:15 2016 +0100
tcp_wrappers-7.6-xgets.patch
diff --git a/misc.c b/misc.c
index b248a5d..204546c 100644
--- a/misc.c
+++ b/misc.c
@@ -35,20 +35,32 @@ FILE *fp;
{
int got;
char *start = ptr;
+ int c, last;
- while (fgets(ptr, len, fp)) {
+ while (len && fgets(ptr, len, fp)) {
got = strlen(ptr);
if (got >= 1 && ptr[got - 1] == '\n') {
tcpd_context.line++;
if (got >= 2 && ptr[got - 2] == '\\') {
- got -= 2;
+ got -= 2;
} else {
- return (start);
+ return (start);
}
+ ptr += got;
+ len -= got;
+ ptr[0] = 0;
+ } else {
+ /* over buffer len */
+ last = (got >= 1) ? ptr[got - 1] : '\0';
+ while ((c = fgetc(fp)) != EOF) {
+ if (c == '\n') {
+ tcpd_context.line++;
+ if (last != '\\')
+ return (start);
+ }
+ last = c;
+ }
}
- ptr += got;
- len -= got;
- ptr[0] = 0;
}
return (ptr > start ? start : 0);
}