From: David Levine Date: Sat, 6 Sep 2014 13:00:52 +0000 (-0500) Subject: Check return values of system calls in uip/ and test/ .c files, found X-Git-Url: https://diplodocus.org/git/nmh/commitdiff_plain/a57e5d9907d845d6f83d2cfdea55cd52efad793f?ds=inline;hp=-c Check return values of system calls in uip/ and test/ .c files, found with gcc's -D_FORTIFY_SOURCE=2. --- a57e5d9907d845d6f83d2cfdea55cd52efad793f diff --git a/test/fakepop.c b/test/fakepop.c index a0303458..4d023545 100644 --- a/test/fakepop.c +++ b/test/fakepop.c @@ -358,7 +358,9 @@ putpop(int socket, char *data) iov[1].iov_base = "\r\n"; iov[1].iov_len = 2; - writev(socket, iov, 2); + if (writev(socket, iov, 2) < 0) { + perror ("writev"); + } } /* @@ -371,7 +373,9 @@ putpopbulk(int socket, char *data) { ssize_t datalen = strlen(data); - write(socket, data, datalen); + if (write(socket, data, datalen) < 0) { + perror ("write"); + } } /* diff --git a/test/fakesmtp.c b/test/fakesmtp.c index 7121c302..b812f23e 100644 --- a/test/fakesmtp.c +++ b/test/fakesmtp.c @@ -263,7 +263,9 @@ putsmtp(int socket, char *data) iov[1].iov_base = "\r\n"; iov[1].iov_len = 2; - writev(socket, iov, 2); + if (writev(socket, iov, 2) < 0) { + perror ("writev"); + } } /* diff --git a/uip/comp.c b/uip/comp.c index 2f7da416..13d73c1b 100644 --- a/uip/comp.c +++ b/uip/comp.c @@ -381,7 +381,10 @@ try_it_again: dat[3] = outputlinelen; dat[4] = 0; fmt_scan(fmt, scanl, i, dat, NULL); - write(out, charstring_buffer (scanl), charstring_bytes (scanl)); + if (write(out, charstring_buffer (scanl), + charstring_bytes (scanl)) < 0) { + advise (drft, "write"); + } charstring_free(scanl); } else { cpydata (in, out, form, drft); diff --git a/uip/dropsbr.c b/uip/dropsbr.c index 915e71e6..dee95fe7 100644 --- a/uip/dropsbr.c +++ b/uip/dropsbr.c @@ -80,8 +80,12 @@ mbx_open (char *file, int mbx_style, uid_t uid, gid_t gid, mode_t mode) * The stat failed. So we make sure file * has right ownership/modes */ - chown (file, uid, gid); - chmod (file, mode); + if (chown (file, uid, gid) < 0) { + advise (file, "chown"); + } + if (chmod (file, mode) < 0) { + advise (file, "chmod"); + } } else if (st.st_size > (off_t) 0) { int status; @@ -396,7 +400,9 @@ mbx_copy (char *mailbox, int mbx_style, int md, int fd, * "From ", then prepend line with ">". */ if (j != 0 && strncmp (buffer, "From ", 5) == 0) { - write (md, ">", 1); + if (write (md, ">", 1) < 0) { + advise (mailbox, "write"); + } size++; } i = strlen (buffer); diff --git a/uip/forw.c b/uip/forw.c index 2139d35c..d3fd4238 100644 --- a/uip/forw.c +++ b/uip/forw.c @@ -599,7 +599,9 @@ copy_draft (int out, char *digest, char *file, int volume, int issue, int dashst strncpy (bp, "\n\n", buflen); } - write (out, buffer, strlen (buffer)); + if (write (out, buffer, strlen (buffer)) < 0) { + advise (drft, "write"); + } if ((fd = open (msgnam = m_name (msgnum), O_RDONLY)) == NOTOK) { admonish (msgnam, "unable to read message"); @@ -626,7 +628,9 @@ copy_draft (int out, char *digest, char *file, int volume, int issue, int dashst snprintf (buffer, sizeof(buffer), "\n------- End of Forwarded Message%s\n", mp->numsel > 1 ? "s" : ""); } - write (out, buffer, strlen (buffer)); + if (write (out, buffer, strlen (buffer)) < 0) { + advise (drft, "write"); + } if (digest) { snprintf (buffer, sizeof(buffer), "End of %s Digest [Volume %d Issue %d]\n", @@ -636,7 +640,9 @@ copy_draft (int out, char *digest, char *file, int volume, int issue, int dashst *bp++ = '*'; *bp++ = '\n'; *bp = 0; - write (out, buffer, strlen (buffer)); + if (write (out, buffer, strlen (buffer)) < 0) { + advise (drft, "write"); + } } } @@ -653,11 +659,17 @@ copy_mime_draft (int out) snprintf (buffer, sizeof(buffer), "#forw [forwarded message%s] +%s", mp->numsel == 1 ? "" : "s", mp->foldpath); - write (out, buffer, strlen (buffer)); + if (write (out, buffer, strlen (buffer)) < 0) { + advise (drft, "write"); + } for (msgnum = mp->lowsel; msgnum <= mp->hghsel; msgnum++) if (is_selected (mp, msgnum)) { snprintf (buffer, sizeof(buffer), " %s", m_name (msgnum)); - write (out, buffer, strlen (buffer)); + if (write (out, buffer, strlen (buffer)) < 0) { + advise (drft, "write"); + } } - write (out, "\n", 1); + if (write (out, "\n", 1) < 0) { + advise (drft, "write newline"); + } } diff --git a/uip/install-mh.c b/uip/install-mh.c index 12377352..2240f870 100644 --- a/uip/install-mh.c +++ b/uip/install-mh.c @@ -166,7 +166,9 @@ query: } } - chdir (mypath); + if (chdir (mypath) < 0) { + advise (mypath, "chdir"); + } if (chdir (pathname) == NOTOK) { cp = concat ("\"", pathname, "\" doesn't exist; Create it? ", NULL); if (autof || gans (cp, anoyes)) diff --git a/uip/mhlsbr.c b/uip/mhlsbr.c index 3a53941d..0c9719c2 100644 --- a/uip/mhlsbr.c +++ b/uip/mhlsbr.c @@ -973,7 +973,9 @@ mhlfile (FILE *fp, char *mname, int ofilen, int ofilec) } fflush (stdout); buf[0] = 0; - read (fileno (stdout), buf, sizeof(buf)); + if (read (fileno (stdout), buf, sizeof(buf)) < 0) { + advise ("stdout", "read"); + } } if (strchr(buf, '\n')) { if ((global.c_flags & CLEARSCR)) @@ -1487,7 +1489,9 @@ putch (char ch, long flags) putchar ('\007'); fflush (stdout); buf[0] = 0; - read (fileno (stdout), buf, sizeof(buf)); + if (read (fileno (stdout), buf, sizeof(buf)) < 0) { + advise ("stdout", "read"); + } if (strchr(buf, '\n')) { if (global.c_flags & CLEARSCR) nmh_clear_screen (); @@ -1719,7 +1723,9 @@ filterbody (struct mcomp *c1, char *buf, int bufsz, int state, FILE *fp, while (state == BODY) { int bufsz2 = bufsz; - write(fdinput[1], buf, strlen(buf)); + if (write(fdinput[1], buf, strlen(buf)) < 0) { + advise ("pipe output", "write"); + } state = m_getfld (&gstate, name, buf, &bufsz2, fp); } diff --git a/uip/mhshowsbr.c b/uip/mhshowsbr.c index d99f5827..61f04120 100644 --- a/uip/mhshowsbr.c +++ b/uip/mhshowsbr.c @@ -465,8 +465,11 @@ show_content_aux2 (CT ct, int alternate, char *cracked, char *buffer, return NOTOK; case OK: - if (cracked) - chdir (cracked); + if (cracked) { + if (chdir (cracked) < 0) { + advise (cracked, "chdir"); + } + } if (!xstdin) dup2 (fd, 0); close (fd); @@ -1101,7 +1104,10 @@ iconv_start: status = NOTOK; break; } else { - write (fd, dest_buffer, outbytes_before - outbytes); + if (write (fd, dest_buffer, outbytes_before - outbytes) + < 0) { + advise (dest, "write"); + } } } diff --git a/uip/new.c b/uip/new.c index bdbdc73f..2bb8c17a 100644 --- a/uip/new.c +++ b/uip/new.c @@ -261,7 +261,9 @@ check_folders(struct node **first, struct node **last, b.sequences = sequences; if (folders == NULL) { - chdir(m_maildir("")); + if (chdir(m_maildir("")) < 0) { + advise (m_maildir(""), "chdir"); + } crawl_folders(".", crawl_callback, &b); } else { fp = fopen(folders, "r"); @@ -386,7 +388,9 @@ doit(char *cur, char *folders, char *sequences[]) /* TODO: Split enough of scan.c out so that we can call it here. */ command = concat("scan +", node->n_name, " ", sequences_s, (void *)NULL); - system(command); + if (system(command) == NOTOK) { + adios (command, "system"); + } free(command); } else { if (node->n_field == NULL) { diff --git a/uip/popsbr.c b/uip/popsbr.c index 479fdb1f..8334dee6 100644 --- a/uip/popsbr.c +++ b/uip/popsbr.c @@ -487,8 +487,12 @@ pop_init (char *host, char *port, char *user, char *pass, char *proxy, int inpipe[2]; /* for reading from the server */ int outpipe[2]; /* for sending to the server */ - pipe(inpipe); - pipe(outpipe); + if (pipe(inpipe) < 0) { + adios ("inpipe", "pipe"); + } + if (pipe(outpipe) < 0) { + adios ("outpipe", "pipe"); + } pid=fork(); if (pid==0) { diff --git a/uip/rcvtty.c b/uip/rcvtty.c index c3fe470e..24a931b7 100644 --- a/uip/rcvtty.c +++ b/uip/rcvtty.c @@ -265,12 +265,20 @@ header_fd (void) nfs = new_fs (form, format, SCANFMT); scan (stdin, 0, 0, nfs, width, 0, 0, NULL, 0L, 0, &scanl); scan_finished (); - if (newline) - write (fd, "\n\r", 2); - write (fd, charstring_buffer (scanl), charstring_bytes (scanl)); + if (newline) { + if (write (fd, "\n\r", 2) < 0) { + advise (tfile, "write LF/CR"); + } + } + if (write (fd, charstring_buffer (scanl), charstring_bytes (scanl)) < 0) { + advise (tfile, "write"); + } charstring_free (scanl); - if (bell) - write (fd, "\007", 1); + if (bell) { + if (write (fd, "\007", 1) < 0) { + advise (tfile, "write BEL"); + } + } return fd; } diff --git a/uip/refile.c b/uip/refile.c index cd352a40..5d03d4d1 100644 --- a/uip/refile.c +++ b/uip/refile.c @@ -279,7 +279,9 @@ opnfolds (struct msgs *src_folder, struct st_fold *folders, int nfolders) register struct msgs *mp; for (fp = folders, ep = folders + nfolders; fp < ep; fp++) { - chdir (m_maildir ("")); + if (chdir (m_maildir ("")) < 0) { + advise (m_maildir (""), "chdir"); + } strncpy (nmaildir, m_maildir (fp->f_name), sizeof(nmaildir)); /* @@ -302,7 +304,9 @@ opnfolds (struct msgs *src_folder, struct st_fold *folders, int nfolders) fp->f_mp = src_folder; } - chdir (maildir); + if (maildir[0] != '\0' && chdir (maildir) < 0) { + advise (maildir, "chdir"); + } } } diff --git a/uip/replsbr.c b/uip/replsbr.c index aec090fe..c4ca0c4b 100644 --- a/uip/replsbr.c +++ b/uip/replsbr.c @@ -469,11 +469,13 @@ replfilter (FILE *in, FILE *out, char *filter, int fmtproc) execvp (mhl, arglist); errstr = strerror(errno); - write(2, "unable to exec ", 15); - write(2, mhlproc, strlen(mhlproc)); - write(2, ": ", 2); - write(2, errstr, strlen(errstr)); - write(2, "\n", 1); + if (write(2, "unable to exec ", 15) < 0 || + write(2, mhlproc, strlen(mhlproc)) < 0 || + write(2, ": ", 2) < 0 || + write(2, errstr, strlen(errstr)) < 0 || + write(2, "\n", 1) < 0) { + advise ("stderr", "write"); + } _exit (-1); default: diff --git a/uip/rmf.c b/uip/rmf.c index bb03805a..c7e6426c 100644 --- a/uip/rmf.c +++ b/uip/rmf.c @@ -193,7 +193,9 @@ rmf (char *folder) */ rma (folder); - chdir (".."); + if (chdir ("..") < 0) { + advise ("..", "chdir"); + } if (others == 0 && remdir (maildir)) return OK; diff --git a/uip/sendsbr.c b/uip/sendsbr.c index 020949d0..af9412df 100644 --- a/uip/sendsbr.c +++ b/uip/sendsbr.c @@ -498,13 +498,19 @@ alert (char *file, int out) } else { lseek (out, (off_t) 0, SEEK_END); strncpy (buf, "\nMessage not delivered to anyone.\n", sizeof(buf)); - write (out, buf, strlen (buf)); + if (write (out, buf, strlen (buf)) < 0) { + advise (file, "write"); + } strncpy (buf, "\n------- Unsent Draft\n\n", sizeof(buf)); - write (out, buf, strlen (buf)); + if (write (out, buf, strlen (buf)) < 0) { + advise (file, "write"); + } cpydgst (in, out, file, "temporary file"); close (in); strncpy (buf, "\n------- End of Unsent Draft\n", sizeof(buf)); - write (out, buf, strlen (buf)); + if (write (out, buf, strlen (buf)) < 0) { + advise (file, "write"); + } if (rename (file, strncpy (buf, m_backup (file), sizeof(buf))) == NOTOK) admonish (buf, "unable to rename %s to", file); } @@ -597,7 +603,9 @@ anno (int fd, struct stat *st) /* reset the signal mask */ sigprocmask (SIG_SETMASK, &oset, &set); - chdir (cwd); + if (chdir (cwd) < 0) { + advise (cwd, "chdir"); + } break; default: /* no waiting... */ diff --git a/uip/slocal.c b/uip/slocal.c index 8afef253..a26432c5 100644 --- a/uip/slocal.c +++ b/uip/slocal.c @@ -279,7 +279,9 @@ main (int argc, char **argv) adios (NULL, "no such local user as %s", user); if (chdir (pw->pw_dir) == -1) - chdir ("/"); + if (chdir ("/") < 0) { + advise ("/", "chdir"); + } umask (0077); if (geteuid() == 0) { @@ -1067,8 +1069,12 @@ usr_pipe (int fd_arg, char *cmd, char *pgm, char **vec, int suppress) /* child process */ if (fd != 0) dup2 (fd, 0); - freopen ("/dev/null", "w", stdout); - freopen ("/dev/null", "w", stderr); + if (freopen ("/dev/null", "w", stdout) == NULL) { + advise ("stdout", "freopen"); + } + if (freopen ("/dev/null", "w", stderr) == NULL) { + advise ("stderr", "freopen"); + } if (fd != 3) dup2 (fd, 3); closefds (4); diff --git a/uip/whatnowproc.c b/uip/whatnowproc.c index 05dc8ff3..8fc6ee72 100644 --- a/uip/whatnowproc.c +++ b/uip/whatnowproc.c @@ -99,8 +99,11 @@ what_now (char *ed, int nedit, int use, char *file, char *altmsg, int dist, context_save (); /* save the context file */ fflush (stdout); - if (cwd) - chdir (cwd); + if (cwd) { + if (chdir (cwd) < 0) { + advise (cwd, "chdir"); + } + } /* * If the "whatnowproc" is the nmh command "whatnow", diff --git a/uip/whatnowsbr.c b/uip/whatnowsbr.c index 6e08d3eb..2c2d2043 100644 --- a/uip/whatnowsbr.c +++ b/uip/whatnowsbr.c @@ -321,7 +321,9 @@ WhatNow (int argc, char **argv) writesomecmd(buf, BUFSIZ, "cd", "pwd", argp); } if ((f = popen_in_dir(cwd, buf, "r")) != (FILE *)0) { - fgets(cwd, sizeof (cwd), f); + if (fgets(cwd, sizeof (cwd), f) == NULL) { + advise (buf, "fgets"); + } if (strchr(cwd, '\n') != (char *)0) *strchr(cwd, '\n') = '\0'; @@ -691,7 +693,9 @@ editfile (char **ed, char **arg, char *file, int use, struct msgs *mp, if (atfile) { (void) m_unlink (linkpath); if (link (altpath, linkpath) == NOTOK) { - symlink (altpath, linkpath); + if (symlink (altpath, linkpath) < 0) { + adios (linkpath, "symlink"); + } slinked = 1; } else { slinked = 0; @@ -709,8 +713,11 @@ editfile (char **ed, char **arg, char *file, int use, struct msgs *mp, break; case OK: - if (cwd) - chdir (cwd); + if (cwd) { + if (chdir (cwd) < 0) { + advise (cwd, "chdir"); + } + } if (altmsg) { if (mp) m_putenv ("mhfolder", mp->foldpath);