summaryrefslogtreecommitdiff
path: root/src/lib/libc/net/getservent.c
diff options
context:
space:
mode:
authormillert <>1998-03-16 05:07:02 +0000
committermillert <>1998-03-16 05:07:02 +0000
commit7cc61258b3b66c62b0828fdaa234ee8ae2fee2dc (patch)
treed54fd8f615df82fffca9638aee76c24acf5b731f /src/lib/libc/net/getservent.c
parentfcd822203d1ea91b0c87703a36e5819909a8f7f4 (diff)
downloadopenbsd-7cc61258b3b66c62b0828fdaa234ee8ae2fee2dc.tar.gz
openbsd-7cc61258b3b66c62b0828fdaa234ee8ae2fee2dc.tar.bz2
openbsd-7cc61258b3b66c62b0828fdaa234ee8ae2fee2dc.zip
Use fgetln(3) instead of fgets(3) so we can easily recognize lines
that are too long and ignore them instead of corrupting later entries.
Diffstat (limited to 'src/lib/libc/net/getservent.c')
-rw-r--r--src/lib/libc/net/getservent.c20
1 files changed, 12 insertions, 8 deletions
diff --git a/src/lib/libc/net/getservent.c b/src/lib/libc/net/getservent.c
index feb97aa129..7d8cb6d8ca 100644
--- a/src/lib/libc/net/getservent.c
+++ b/src/lib/libc/net/getservent.c
@@ -32,7 +32,7 @@
32 */ 32 */
33 33
34#if defined(LIBC_SCCS) && !defined(lint) 34#if defined(LIBC_SCCS) && !defined(lint)
35static char rcsid[] = "$OpenBSD: getservent.c,v 1.3 1997/04/05 21:13:09 millert Exp $"; 35static char rcsid[] = "$OpenBSD: getservent.c,v 1.4 1998/03/16 05:07:00 millert Exp $";
36#endif /* LIBC_SCCS and not lint */ 36#endif /* LIBC_SCCS and not lint */
37 37
38#include <sys/types.h> 38#include <sys/types.h>
@@ -74,20 +74,24 @@ endservent()
74struct servent * 74struct servent *
75getservent() 75getservent()
76{ 76{
77 char *p; 77 char *p, *cp, **q;
78 register char *cp, **q; 78 size_t len;
79 79
80 if (servf == NULL && (servf = fopen(_PATH_SERVICES, "r" )) == NULL) 80 if (servf == NULL && (servf = fopen(_PATH_SERVICES, "r" )) == NULL)
81 return (NULL); 81 return (NULL);
82again: 82again:
83 if ((p = fgets(line, BUFSIZ, servf)) == NULL) 83 if ((p = fgetln(servf, &len)) == NULL)
84 return (NULL); 84 return (NULL);
85 if (*p == '#') 85 if (p[len-1] == '\n')
86 len--;
87 if (len >= sizeof(line) || len == 0)
86 goto again; 88 goto again;
87 cp = strpbrk(p, "#\n"); 89 p = memcpy(line, p, len);
88 if (cp == NULL) 90 line[len] = '\0';
91 if (*p == '#')
89 goto again; 92 goto again;
90 *cp = '\0'; 93 if ((cp = strchr(p, '#')) != NULL)
94 *cp = '\0';
91 serv.s_name = p; 95 serv.s_name = p;
92 p = strpbrk(p, " \t"); 96 p = strpbrk(p, " \t");
93 if (p == NULL) 97 if (p == NULL)