File: fix_parsing_long_lines

package info (click to toggle)
tcp-wrappers 7.6.q-32
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 1,844 kB
  • sloc: ansic: 17,852; makefile: 2,301; sh: 92
file content (41 lines) | stat: -rw-r--r-- 1,336 bytes parent folder | download | duplicates (7)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
Description: Fix parsing of lines longer than 2047 characters
 If a line in /etc/hosts.{allow,deny} is longer than BUFLEN-1 (2047)
 characters then len will be set to 1 at the end of the xgets() loop.
 .
 At the next iteration, fgets will be passed a buffer of length 1, so it
 will only be able to read an empty string (the buffer must always have
 space for the trailing NUL).
 .
 strlen(3) on the empty string will return 0, so len will not be modified
 anymore and the last step will repeat forever.
 .
 To reproduce:
 perl -e 'print "#sshd: " . ("127.0.0.1, " x 210) . "\n"' > hosts.deny
 tcpdmatch -d test localhost
Author: Marco d'Itri <md@linux.it>
Bug-Debian: http://bugs.debian.org/596261

--- a/misc.c
+++ b/misc.c
@@ -45,6 +45,8 @@ FILE   *fp;
 	}
 	ptr += got;
 	len -= got;
+	if (len == 1)
+	    return(start);
 	ptr[0] = 0;
     }
     return (ptr > start ? start : 0);
--- a/hosts_access.c
+++ b/hosts_access.c
@@ -165,7 +165,9 @@ struct request_info *request;
 	while (match == NO && xgets(sv_list, sizeof(sv_list), fp) != 0) {
 	    if (sv_list[strlen(sv_list) - 1] != '\n') {
 		tcpd_warn("missing newline or line too long");
-		continue;
+		tcpd_warn("all the subsequent rules will be ignored");
+		match = ERR;
+		break;
 	    }
 	    if (sv_list[0] == '#' || sv_list[strspn(sv_list, " \t\r\n")] == 0)
 		continue;