Coverity fixes
authorJeremy Harris <jgh146exb@wizmail.org>
Tue, 28 Feb 2017 23:57:36 +0000 (23:57 +0000)
committerPhil Pennock <pdp@exim.org>
Wed, 1 Mar 2017 02:55:52 +0000 (21:55 -0500)
(cherry picked from commit 59d9803955886f56f67e3ceff5632b704e4c5548)
Signed-off-by: Phil Pennock <pdp@exim.org>
src/src/dkim.c
src/src/receive.c

index 2873eda5310095674e8a8c021a8d09bf53517977..f644fbfdd87346e7b3dacc69d8dcbd16c90e5fc9 100644 (file)
@@ -571,7 +571,7 @@ while ((dkim_signing_domain = string_nextinlist(&dkim_domain, &sep,
 
   if (dkim_private_key_expanded[0] == '/')
     {
-    int privkey_fd = 0;
+    int privkey_fd, off = 0, len;
 
     /* Looks like a filename, load the private key. */
 
@@ -585,14 +585,21 @@ while ((dkim_signing_domain = string_nextinlist(&dkim_domain, &sep,
       goto bad;
       }
 
-    if (read(privkey_fd, big_buffer, big_buffer_size - 2) < 0)
+    do
       {
-      log_write(0, LOG_MAIN|LOG_PANIC, "unable to read private key file: %s",
-                dkim_private_key_expanded);
-      goto bad;
+      if ((len = read(privkey_fd, big_buffer + off, big_buffer_size - 2 - off)) < 0)
+       {
+       (void) close(privkey_fd);
+       log_write(0, LOG_MAIN|LOG_PANIC, "unable to read private key file: %s",
+                  dkim_private_key_expanded);
+       goto bad;
+       }
+      off += len;
       }
+    while (len > 0);
 
     (void) close(privkey_fd);
+    big_buffer[off] = '\0';
     dkim_private_key_expanded = big_buffer;
     }
 
index ed2c57ba5e75fc507a9ad3187c9a2d9334e121f5..7980c324fc1d42c1bca0462928e4cecb89782d00 100644 (file)
@@ -938,8 +938,11 @@ for(;;)
       that would need to be duplicated here.  So we simply do some ungetc
       trickery.
       */
-      fseek(fout, -1, SEEK_CUR);
-      if (fgetc(fout) == '\n') return END_DOT;
+      if (fout)
+       {
+       if (fseek(fout, -1, SEEK_CUR) < 0)      return END_PROTOCOL;
+       if (fgetc(fout) == '\n')                return END_DOT;
+       }
 
       if (linelength == -1)    /* \r already seen (see below) */
         {
@@ -987,7 +990,7 @@ for(;;)
       else
        {
        message_size++;
-       if (fout != NULL && fputc('\n', fout) == EOF) return END_WERROR;
+       if (fout && fputc('\n', fout) == EOF) return END_WERROR;
        (void) cutthrough_put_nl();
        if (ch == '\r') continue;       /* don't write CR */
        ch_state = MID_LINE;