"Todd C. Miller" <[email protected]> writes:
> On Fri, 14 Jul 2017 22:59:58 +0200, Jeremie Courreges-Anglas wrote:
>
>> "Todd C. Miller" <[email protected]> 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