Fixed two fd leaks in mhparse.c.
authormarkus schnalke <meillo@marmaro.de>
Tue, 27 Mar 2012 13:07:59 +0000 (15:07 +0200)
committermarkus schnalke <meillo@marmaro.de>
Tue, 27 Mar 2012 13:07:59 +0000 (15:07 +0200)
1) In openQuoted(), the decoded contents file was opened twice in
   succession. The second open was added by a patch in March 2000.
2) openBase64(), openQuoted(), and open7Bit() could open the contents
   file, but it never would be closed. Added code to each to close the
   file if the function opened it.
[Bug #24004: (debbug 344182)]

Pulled in from nmh. Thanks to David Levine.

uip/mhparse.c

index d38f251..bf65480 100644 (file)
@@ -1696,7 +1696,7 @@ static int
 openBase64(CT ct, char **file)
 {
        int bitno, cc, digested;
-       int fd, len, skip;
+       int fd, len, skip, own_ct_fp = 0;
        unsigned long bits;
        unsigned char value, *b, *b1, *b2, *b3;
        unsigned char *cp, *ep;
@@ -1772,9 +1772,13 @@ openBase64(CT ct, char **file)
        if ((len = ct->c_end - ct->c_begin) < 0)
                adios(NULL, "internal error(1)");
 
-       if (!ct->c_fp && (ct->c_fp = fopen(ct->c_file, "r")) == NULL) {
-               content_error(ct->c_file, ct, "unable to open for reading");
-               return NOTOK;
+       if (!ct->c_fp) {
+               if ((ct->c_fp = fopen(ct->c_file, "r")) == NULL) {
+                       content_error(ct->c_file, ct,
+                                       "unable to open for reading");
+                       return NOTOK;
+               }
+               own_ct_fp = 1;
        }
 
        if ((digested = ct->c_digested))
@@ -1880,10 +1884,18 @@ self_delimiting:
 
 ready_to_go:
        *file = ce->ce_file;
+       if (own_ct_fp) {
+               fclose(ct->c_fp);
+               ct->c_fp = NULL;
+       }
        return fileno(ce->ce_fp);
 
 clean_up:
        free_encoding(ct, 0);
+       if (own_ct_fp) {
+               fclose(ct->c_fp);
+               ct->c_fp = NULL;
+       }
        return NOTOK;
 }
 
@@ -1922,7 +1934,7 @@ InitQuoted(CT ct)
 static int
 openQuoted(CT ct, char **file)
 {
-       int cc, digested, len, quoted;
+       int cc, digested, len, quoted, own_ct_fp = 0;
        unsigned char *cp, *ep;
        char buffer[BUFSIZ];
        unsigned char mask;
@@ -1987,18 +1999,16 @@ openQuoted(CT ct, char **file)
                return NOTOK;
        }
 
-       if ((ce->ce_fp = fopen(ce->ce_file, "w+")) == NULL) {
-               content_error(ce->ce_file, ct,
-                               "unable to fopen for reading/writing");
-               return NOTOK;
-       }
-
        if ((len = ct->c_end - ct->c_begin) < 0)
                adios(NULL, "internal error(2)");
 
-       if (!ct->c_fp && (ct->c_fp = fopen(ct->c_file, "r")) == NULL) {
-               content_error(ct->c_file, ct, "unable to open for reading");
-               return NOTOK;
+       if (!ct->c_fp) {
+               if ((ct->c_fp = fopen(ct->c_file, "r")) == NULL) {
+                       content_error(ct->c_file, ct,
+                                       "unable to open for reading");
+                       return NOTOK;
+               }
+               own_ct_fp = 1;
        }
 
        if ((digested = ct->c_digested))
@@ -2133,10 +2143,18 @@ openQuoted(CT ct, char **file)
 
 ready_to_go:
        *file = ce->ce_file;
+       if (own_ct_fp) {
+               fclose(ct->c_fp);
+               ct->c_fp = NULL;
+       }
        return fileno(ce->ce_fp);
 
 clean_up:
        free_encoding(ct, 0);
+       if (own_ct_fp) {
+               fclose(ct->c_fp);
+               ct->c_fp = NULL;
+       }
        return NOTOK;
 }
 
@@ -2159,7 +2177,7 @@ Init7Bit(CT ct)
 int
 open7Bit(CT ct, char **file)
 {
-       int cc, fd, len;
+       int cc, fd, len, own_ct_fp = 0;
        char buffer[BUFSIZ];
        /* sbeck -- handle suffixes */
        char *cp;
@@ -2276,9 +2294,13 @@ open7Bit(CT ct, char **file)
        if ((len = ct->c_end - ct->c_begin) < 0)
                adios(NULL, "internal error(3)");
 
-       if (!ct->c_fp && (ct->c_fp = fopen(ct->c_file, "r")) == NULL) {
-               content_error(ct->c_file, ct, "unable to open for reading");
-               return NOTOK;
+       if (!ct->c_fp) {
+               if ((ct->c_fp = fopen(ct->c_file, "r")) == NULL) {
+                       content_error(ct->c_file, ct,
+                                       "unable to open for reading");
+                       return NOTOK;
+               }
+               own_ct_fp = 1;
        }
 
        lseek(fd = fileno(ct->c_fp), (off_t) ct->c_begin, SEEK_SET);
@@ -2316,10 +2338,18 @@ open7Bit(CT ct, char **file)
 
 ready_to_go:
        *file = ce->ce_file;
+       if (own_ct_fp) {
+               fclose(ct->c_fp);
+               ct->c_fp = NULL;
+       }
        return fileno(ce->ce_fp);
 
 clean_up:
        free_encoding(ct, 0);
+       if (own_ct_fp) {
+               fclose(ct->c_fp);
+               ct->c_fp = NULL;
+       }
        return NOTOK;
 }