summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorotto <otto@openbsd.org>2004-05-27 07:41:58 +0000
committerotto <otto@openbsd.org>2004-05-27 07:41:58 +0000
commit1baa618fb3e30a45abfcdcf4a02aedddf946e6a0 (patch)
treeffdfc9816752ce9fa4dcd61d6e57bfe8734b2956
parentchange uvm_km_getpage to take waitok argument and sleep if appropriate. (diff)
downloadwireguard-openbsd-1baa618fb3e30a45abfcdcf4a02aedddf946e6a0.tar.xz
wireguard-openbsd-1baa618fb3e30a45abfcdcf4a02aedddf946e6a0.zip
Rule parser improvements: line numbers, no nl at eof, handling of lines
with too many tokens. Based on diff from Jared Yanovich. ok tdeval@ deraadt@
-rw-r--r--sbin/brconfig/brconfig.c24
1 files changed, 9 insertions, 15 deletions
diff --git a/sbin/brconfig/brconfig.c b/sbin/brconfig/brconfig.c
index 652f7a49ff4..d2aabbf611d 100644
--- a/sbin/brconfig/brconfig.c
+++ b/sbin/brconfig/brconfig.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: brconfig.c,v 1.31 2004/05/23 06:47:49 deraadt Exp $ */
+/* $OpenBSD: brconfig.c,v 1.32 2004/05/27 07:41:58 otto Exp $ */
/*
* Copyright (c) 1999, 2000 Jason L. Wright (jason@thought.net)
@@ -1290,8 +1290,8 @@ int
bridge_rulefile(int s, char *brdg, char *fname)
{
FILE *f;
- char *str, *argv[MAXRULEWORDS], buf[1024], xbuf[1024];
- int ln = 1, argc = 0, err = 0, xerr;
+ char *str, *argv[MAXRULEWORDS], buf[1024];
+ int ln = 0, argc = 0, err = 0, xerr;
f = fopen(fname, "r");
if (f == NULL) {
@@ -1299,29 +1299,23 @@ bridge_rulefile(int s, char *brdg, char *fname)
return (EX_IOERR);
}
- while (1) {
- fgets(buf, sizeof(buf), f);
- if (feof(f))
- break;
+ while (fgets(buf, sizeof(buf), f) != NULL) {
ln++;
if (buf[0] == '#' || buf[0] == '\n')
continue;
argc = 0;
str = strtok(buf, "\n\t\r ");
- strlcpy(xbuf, buf, sizeof(xbuf));
- while (str != NULL) {
+ while (str != NULL && argc < MAXRULEWORDS) {
argv[argc++] = str;
- if (argc > MAXRULEWORDS) {
- fprintf(stderr, "invalid rule: %d: %s\n",
- ln, xbuf);
- break;
- }
str = strtok(NULL, "\n\t\r ");
}
- if (argc > MAXRULEWORDS)
+ /* Rule is too long if there's more. */
+ if (str != NULL) {
+ fprintf(stderr, "invalid rule: %d: %s ...\n", ln, buf);
continue;
+ }
xerr = bridge_rule(s, brdg, argc, argv, ln);
if (xerr)