Coverity: Resource leak: CID 180
[sxemacs] / lib-src / movemail.c
index 219bced..909a7cc 100644 (file)
@@ -80,6 +80,8 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #include "../src/regex.h"
 #endif
 
+#include <assert.h>
+
 extern char *optarg;
 extern int optind, opterr;
 
@@ -196,7 +198,10 @@ static char *unparse_lock_method(int);
 
 int main(int argc, char *argv[])
 {
-       char *inname = 0, *outname = 0, *poppass = 0;
+       char *inname = 0, *outname = 0;
+#if defined MAIL_USE_POP
+       char *poppass = 0;
+#endif /* MAIL_USE_POP */
 #ifndef DISABLE_DIRECT_ACCESS
        int indesc, outdesc;
        int nread;
@@ -234,12 +239,15 @@ int main(int argc, char *argv[])
                case 0:
                        break;
                case 1: /* one of the standard arguments seen */
-                       if (!inname)
+                       if (!inname) {
                                inname = optarg;
-                       else if (!outname)
+                       } else if (!outname) {
                                outname = optarg;
-                       else
+#if defined MAIL_USE_POP
+                       } else {
                                poppass = optarg;
+#endif /* MAIL_USE_POP */
+                       }
                        break;
 
                case 'i':       /* infile */
@@ -283,12 +291,15 @@ int main(int argc, char *argv[])
        }
 
        while (optind < argc) {
-               if (!inname)
+               if (!inname) {
                        inname = argv[optind];
-               else if (!outname)
+               } else if (!outname) {
                        outname = argv[optind];
-               else
+#if defined MAIL_USE_POP
+               } else {
                        poppass = argv[optind];
+#endif /* MAIL_USE_POP */
+               }
                optind++;
        }
 
@@ -416,16 +427,16 @@ int main(int argc, char *argv[])
 
                {
                        char buf[1024];
-
                        while (1) {
                                nread = read(indesc, buf, sizeof buf);
-                               if (nread != write(outdesc, buf, nread)) {
+                               if (nread < 0 ||  
+                                   nread != write(outdesc, buf, nread)) {
                                        int saved_errno = errno;
                                        unlink(outname);
                                        errno = saved_errno;
                                        pfatal_with_name(outname);
                                }
-                               if (nread < (int)sizeof buf)
+                               if (nread < (int)sizeof(buf))
                                        break;
                        }
                }
@@ -446,7 +457,8 @@ int main(int argc, char *argv[])
                case FLOCKING:
                case LOCKING:
 #ifdef HAVE_FTRUNCATE
-                       ftruncate(indesc, 0L);
+                       if(ftruncate(indesc, 0L)!=0)
+                               pfatal_and_delete(inname);
 #else
                        close(open(inname, O_CREAT | O_TRUNC | O_RDWR, 0666));
 #endif
@@ -587,16 +599,20 @@ static void lock_dot(char *filename)
                /* Give up if cannot do that.  */
 
 #ifdef HAVE_MKSTEMP
+               /* Remove all group and other permissions.. */
+               umask(S_IRWXG|S_IRWXO);
                desc = mkstemp(tempname);
 #else
                desc = open(tempname, O_WRONLY | O_CREAT | O_EXCL, 0666);
 #endif
 
                if (desc < 0) {
-                       char *message = (char *)xmalloc(strlen(tempname) + 50);
-                       sprintf(message,
-                               "%s--see source file lib-src/movemail.c",
-                               tempname);
+                       int msz = strlen(tempname) + 50;
+                       char *message = (char *)xmalloc(msz);
+                       int sz = snprintf(message, msz,
+                                         "%s--see source file lib-src/movemail.c",
+                                         tempname);
+                       assert(sz>=0 && sz < msz);
                        pfatal_with_name(message);
                }
                close(desc);
@@ -618,6 +634,7 @@ static void lock_dot(char *filename)
                }
        }
        strcpy(dotlock_filename, filename);
+       free(tempname);
 }
 #endif                         /* not DISABLE_DIRECT_ACCESS */
 
@@ -671,10 +688,10 @@ static char *concat(char *s1, char *s2, char *s3)
        int len1 = strlen(s1), len2 = strlen(s2), len3 = strlen(s3);
        char *result = (char *)xmalloc(len1 + len2 + len3 + 1);
 
-       strcpy(result, s1);
-       strcpy(result + len1, s2);
-       strcpy(result + len1 + len2, s3);
-       *(result + len1 + len2 + len3) = 0;
+       strncpy(result, s1, len1+1);
+       strncpy(result + len1, s2, len2+1);
+       strncpy(result + len1 + len2, s3, len3+1);
+       *(result + len1 + len2 + len3) = '\0';
 
        return result;
 }