"Todd C. Miller" <todd.mil...@courtesan.com> writes: > On Fri, 14 Jul 2017 22:59:58 +0200, Jeremie Courreges-Anglas wrote: > >> "Todd C. Miller" <todd.mil...@courtesan.com> writes: >> >> > On Fri, 14 Jul 2017 22:15:49 +0200, Jeremie Courreges-Anglas wrote: >> > >> >> the proposal in >> >> >> >> https://marc.info/?l=openbsd-misc&m=150001966325010&w=2 >> >> >> >> made me look at newsyslog and its manually linked lists. Here's a stab >> >> at using TAILQs instead. >> > >> > Oh good, now I don't have to do it ;-) >> >> ;) >> >> > I have a diff to make change errx() into warnx() + continue. >> >> I have a similar diff which is a bit intrusive, as it tries to properly >> free resources allocated in parse_file(). Maybe show us yours first? > > This doesn't attempt to free any resources.
Wouldn't it be better if we at least tried to properly free what was allocated in parse_file()? > One thing I wanted to > do was to make parse_file() return an error value when there was a > parse error so the exit code could be non-zero. That would be better, a valid use case is checking the exit status of newsyslog -n to detect errors. Also, should we really ignore errors for everything, or only for getpwnam/getgrnam(3) errors? The latter appears safer to me. > - todd > > Index: usr.bin/newsyslog/newsyslog.c > =================================================================== > RCS file: /cvs/src/usr.bin/newsyslog/newsyslog.c,v > retrieving revision 1.103 > diff -u -p -u -r1.103 newsyslog.c > --- usr.bin/newsyslog/newsyslog.c 14 Jul 2017 20:51:17 -0000 1.103 > +++ usr.bin/newsyslog/newsyslog.c 14 Jul 2017 21:11:29 -0000 > @@ -510,9 +510,11 @@ parse_file(struct entrylist *list, int * > *group++ = '\0'; > if (*q) { > if (!(isnumberstr(q))) { > - if ((pwd = getpwnam(q)) == NULL) > - errx(1, "%s:%d: unknown user: > %s", > + if ((pwd = getpwnam(q)) == NULL) { > + warnx("%s:%d: unknown user: %s", > conf, lineno, q); > + continue; > + } > working->uid = pwd->pw_uid; > } else > working->uid = atoi(q); > @@ -522,9 +524,11 @@ parse_file(struct entrylist *list, int * > q = group; > if (*q) { > if (!(isnumberstr(q))) { > - if ((grp = getgrnam(q)) == NULL) > - errx(1, "%s:%d: unknown group: > %s", > + if ((grp = getgrnam(q)) == NULL) { > + warnx("%s:%d: unknown group: > %s", > conf, lineno, q); > + continue; > + } > working->gid = grp->gr_gid; > } else > working->gid = atoi(q); > @@ -539,15 +543,19 @@ parse_file(struct entrylist *list, int * > } > > l = strtol(q, &ep, 8); > - if (*ep != '\0' || l < 0 || l > ALLPERMS) > - errx(1, "%s:%d: bad permissions: %s", conf, lineno, q); > + if (*ep != '\0' || l < 0 || l > ALLPERMS) { > + warnx("%s:%d: bad permissions: %s", conf, lineno, q); > + continue; > + } > working->permissions = (mode_t)l; > > q = parse = missing_field(sob(++parse), errline, lineno); > *(parse = son(parse)) = '\0'; > l = strtol(q, &ep, 10); > - if (*ep != '\0' || l < 0 || l >= INT_MAX) > - errx(1, "%s:%d: bad number: %s", conf, lineno, q); > + if (*ep != '\0' || l < 0 || l >= INT_MAX) { > + warnx("%s:%d: bad number: %s", conf, lineno, q); > + continue; > + } > working->numlogs = (int)l; > > q = parse = missing_field(sob(++parse), errline, lineno); > @@ -561,23 +569,29 @@ parse_file(struct entrylist *list, int * > q = parse = missing_field(sob(++parse), errline, lineno); > *(parse = son(parse)) = '\0'; > l = strtol(q, &ep, 10); > - if (l < 0 || l >= INT_MAX) > - errx(1, "%s:%d: interval out of range: %s", conf, > + if (l < 0 || l >= INT_MAX) { > + warnx("%s:%d: interval out of range: %s", conf, > lineno, q); > + continue; > + } > working->hours = (int)l; > switch (*ep) { > case '\0': > break; > case '@': > working->trim_at = parse8601(ep + 1); > - if (working->trim_at == (time_t) - 1) > - errx(1, "%s:%d: bad time: %s", conf, lineno, q); > + if (working->trim_at == (time_t) - 1) { > + warnx("%s:%d: bad time: %s", conf, lineno, q); > + continue; > + } > working->flags |= CE_TRIMAT; > break; > case '$': > working->trim_at = parseDWM(ep + 1); > - if (working->trim_at == (time_t) - 1) > - errx(1, "%s:%d: bad time: %s", conf, lineno, q); > + if (working->trim_at == (time_t) - 1) { > + warnx("%s:%d: bad time: %s", conf, lineno, q); > + continue; > + } > working->flags |= CE_TRIMAT; > break; > case '*': > @@ -585,8 +599,8 @@ parse_file(struct entrylist *list, int * > break; > /* FALLTHROUGH */ > default: > - errx(1, "%s:%d: bad interval/at: %s", conf, lineno, q); > - break; > + warnx("%s:%d: bad interval/at: %s", conf, lineno, q); > + continue; > } > > q = sob(++parse); /* Optional field */ > @@ -612,9 +626,9 @@ parse_file(struct entrylist *list, int * > working->flags |= CE_FOLLOW; > break; > default: > - errx(1, "%s:%d: illegal flag: `%c'", > + warnx("%s:%d: illegal flag: `%c'", > conf, lineno, *q); > - break; > + continue; > } > q++; > } > @@ -631,9 +645,11 @@ parse_file(struct entrylist *list, int * > break; > if (*q == '/') { > *(parse = son(parse)) = '\0'; > - if (strlen(q) >= PATH_MAX) > - errx(1, "%s:%d: pathname too long: %s", > + if (strlen(q) >= PATH_MAX) { > + warnx("%s:%d: pathname too long: %s", > conf, lineno, q); > + continue; > + } > working->pidfile = strdup(q); > if (working->pidfile == NULL) > err(1, "strdup"); > @@ -656,23 +672,29 @@ parse_file(struct entrylist *list, int * > break; > } > } > - if (i == NSIG) > - errx(1, "%s:%d: unknown signal: %s", > + if (i == NSIG) { > + warnx("%s:%d: unknown signal: %s", > conf, lineno, q); > + continue; > + } > } else if (working->flags & CE_MONITOR) { > *(parse = son(parse)) = '\0'; > working->whom = strdup(q); > if (working->whom == NULL) > err(1, "strdup"); > - } else > - errx(1, "%s:%d: unrecognized field: %s", > + } else { > + warnx("%s:%d: unrecognized field: %s", > conf, lineno, q); > + continue; > + } > } > free(errline); > > - if ((working->flags & CE_MONITOR) && working->whom == NULL) > - errx(1, "%s:%d: missing monitor notification field", > + if ((working->flags & CE_MONITOR) && working->whom == NULL) { > + warnx("%s:%d: missing monitor notification field", > conf, lineno); > + continue; > + } > > /* If there is an arcdir, set working->backdir. */ > if (arcdir != NULL && working->logbase != NULL) { > @@ -701,15 +723,19 @@ parse_file(struct entrylist *list, int * > if (working->backdir != NULL) { > if (snprintf(line, sizeof(line), "%s/%s.%d%s", > working->backdir, working->logbase, > - working->numlogs, COMPRESS_POSTFIX) >= PATH_MAX) > - errx(1, "%s:%d: pathname too long: %s", > + working->numlogs, COMPRESS_POSTFIX) >= PATH_MAX) { > + warnx("%s:%d: pathname too long: %s", > conf, lineno, q); > + continue; > + } > } else { > if (snprintf(line, sizeof(line), "%s.%d%s", > working->log, working->numlogs, COMPRESS_POSTFIX) > - >= PATH_MAX) > - errx(1, "%s:%d: pathname too long: %s", > + >= PATH_MAX) { > + warnx("%s:%d: pathname too long: %s", > conf, lineno, working->log); > + continue; > + } > } > TAILQ_INSERT_TAIL(list, working, next); > (*nentries)++; > -- jca | PGP : 0x1524E7EE / 5135 92C1 AD36 5293 2BDF DDCC 0DFA 74AE 1524 E7EE