=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/calendar/io.c,v retrieving revision 1.37 retrieving revision 1.46 diff -u -r1.37 -r1.46 --- src/usr.bin/calendar/io.c 2015/01/16 06:40:06 1.37 +++ src/usr.bin/calendar/io.c 2017/08/21 21:41:13 1.46 @@ -1,4 +1,4 @@ -/* $OpenBSD: io.c,v 1.37 2015/01/16 06:40:06 deraadt Exp $ */ +/* $OpenBSD: io.c,v 1.46 2017/08/21 21:41:13 deraadt Exp $ */ /* * Copyright (c) 1989, 1993, 1994 @@ -44,7 +44,6 @@ #include #include #include -#include #include #include @@ -90,13 +89,12 @@ if (strncmp(buf, "LANG=", 5) == 0) { (void) setlocale(LC_ALL, buf + 5); setnnames(); - if (!strcmp(buf + 5, "ru_RU.KOI8-R") || - !strcmp(buf + 5, "uk_UA.KOI8-U") || - !strcmp(buf + 5, "by_BY.KOI8-B")) { + if (!strcmp(buf + 5, "ru_RU.UTF-8") || + !strcmp(buf + 5, "uk_UA.UTF-8") || + !strcmp(buf + 5, "by_BY.UTF-8")) { bodun_maybe++; bodun = 0; - if (prefix) - free(prefix); + free(prefix); prefix = NULL; } else bodun_maybe = 0; @@ -121,8 +119,7 @@ calendar = LUNAR; } else if (bodun_maybe && strncmp(buf, "BODUN=", 6) == 0) { bodun++; - if (prefix) - free(prefix); + free(prefix); if ((prefix = strdup(buf + 6)) == NULL) err(1, NULL); continue; @@ -135,8 +132,7 @@ (p - buf == spev[i].nlen) && buf[spev[i].nlen + 1]) { p++; - if (spev[i].uname != NULL) - free(spev[i].uname); + free(spev[i].uname); if ((spev[i].uname = strdup(p)) == NULL) err(1, NULL); spev[i].ulen = strlen(p); @@ -160,13 +156,13 @@ var = 0; if (printing) { struct match *foo; - + ev1 = NULL; while (m) { cur_evt = malloc(sizeof(struct event)); if (cur_evt == NULL) err(1, NULL); - + cur_evt->when = m->when; snprintf(cur_evt->print_date, sizeof(cur_evt->print_date), "%s%c", @@ -208,8 +204,7 @@ tmp = events; while (tmp) { events = tmp; - if (tmp->ldesc) - free(tmp->ldesc); + free(tmp->ldesc); tmp = tmp->next; free(events); } @@ -282,12 +277,16 @@ } } if (i > NUMEV) { - switch(*start) { + const char *errstr; + + switch (*start) { case '-': case '+': - var = atoi(start); - if (var > 365 || var < -365) + var = strtonum(start + 1, 0, 365, &errstr); + if (errstr) return (0); /* Someone is just being silly */ + if (*start == '-') + var = -var; val += (NUMEV + 1) * var; /* We add one to the matching event and multiply by * (NUMEV + 1) so as not to return 0 if there's a match. @@ -295,7 +294,7 @@ * number of special events. */ break; } - *flags |= F_SPECIAL; + *flags |= F_SPECIAL; } if (!(*flags & F_SPECIAL)) { /* undefined rest */ @@ -332,12 +331,15 @@ } } - if (pipe(pdes) < 0) + if (pipe(pdes) < 0) { + close(fdin); return (NULL); + } switch (vfork()) { case -1: /* error */ (void)close(pdes[0]); (void)close(pdes[1]); + close(fdin); return (NULL); case 0: dup2(fdin, STDIN_FILENO); @@ -347,7 +349,7 @@ (void)close(pdes[1]); } (void)close(pdes[0]); - /* + /* * Set stderr to /dev/null. Necessary so that cron does not * wait for cpp to finish if it's running calendar -a. */ @@ -383,6 +385,7 @@ struct stat sbuf; int nread, pdes[2], status; char buf[1024]; + pid_t pid; if (!doall) return; @@ -392,7 +395,7 @@ goto done; if (pipe(pdes) < 0) goto done; - switch (vfork()) { + switch ((pid = vfork())) { case -1: /* error */ (void)close(pdes[0]); (void)close(pdes[1]); @@ -419,8 +422,10 @@ (void)write(pdes[1], buf, nread); (void)close(pdes[1]); done: (void)fclose(fp); - while (wait(&status) >= 0) - ; + while (waitpid(pid, &status, 0) == -1) { + if (errno != EINTR) + break; + } }