=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/calendar/io.c,v retrieving revision 1.19 retrieving revision 1.23 diff -u -r1.19 -r1.23 --- src/usr.bin/calendar/io.c 2001/11/19 19:02:13 1.19 +++ src/usr.bin/calendar/io.c 2003/04/06 19:59:12 1.23 @@ -1,4 +1,4 @@ -/* $OpenBSD: io.c,v 1.19 2001/11/19 19:02:13 mpech Exp $ */ +/* $OpenBSD: io.c,v 1.23 2003/04/06 19:59:12 grange Exp $ */ /* * Copyright (c) 1989, 1993, 1994 @@ -43,7 +43,7 @@ #if 0 static const char sccsid[] = "@(#)calendar.c 8.3 (Berkeley) 3/25/94"; #else -static char rcsid[] = "$OpenBSD: io.c,v 1.19 2001/11/19 19:02:13 mpech Exp $"; +static char rcsid[] = "$OpenBSD: io.c,v 1.23 2003/04/06 19:59:12 grange Exp $"; #endif #endif /* not lint */ @@ -82,7 +82,7 @@ void -cal() +cal(void) { int printing; char *p; @@ -92,6 +92,7 @@ char buf[2048 + 1], *prefix = NULL; struct event *events, *cur_evt, *ev1, *tmp; struct match *m; + size_t nlen; events = NULL; cur_evt = NULL; @@ -178,10 +179,11 @@ if (m->bodun && prefix) { int l1 = strlen(prefix); int l2 = strlen(p); + int len = l1 + l2 + 2; if ((cur_evt->ldesc = - malloc(l1 + l2)) == NULL) + malloc(len)) == NULL) err(1, "malloc"); - sprintf(cur_evt->ldesc, + snprintf(cur_evt->ldesc, len, "\t%s %s", prefix, p + 1); } else if ((cur_evt->ldesc = strdup(p)) == NULL) @@ -197,11 +199,10 @@ } } else if (printing) { - if ((ev1->ldesc = realloc(ev1->ldesc, - (2 + strlen(ev1->ldesc) + strlen(buf)))) == NULL) + nlen = strlen(ev1->ldesc) + strlen(buf) + 2; + if ((ev1->ldesc = realloc(ev1->ldesc, nlen)) == NULL) err(1, NULL); - strcat(ev1->ldesc, "\n"); - strcat(ev1->ldesc, buf); + snprintf(ev1->ldesc, nlen, "%s\n%s", ev1->ldesc, buf); } } tmp = events; @@ -315,13 +316,14 @@ FILE * -opencal() +opencal(void) { - int pdes[2]; - int fdin; + int pdes[2], fdin; + struct stat st; /* open up calendar file as stdin */ - if ((fdin = open(calendarFile, O_RDONLY)) == -1) { + if ((fdin = open(calendarFile, O_RDONLY)) == -1 || + fstat(fdin, &st) == -1 || !S_ISREG(st.st_mode)) { if (!doall) { char *home = getenv("HOME"); if (home == NULL || *home == '\0') @@ -333,6 +335,7 @@ calendarFile, calendarHome, calendarFile); } } + if (pipe(pdes) < 0) return (NULL); switch (vfork()) { @@ -348,7 +351,8 @@ (void)close(pdes[1]); } (void)close(pdes[0]); - /* Set stderr to /dev/null. Necessary so that cron does not + /* + * Set stderr to /dev/null. Necessary so that cron does not * wait for cpp to finish if it's running calendar -a. */ if (doall) {