From 047888a8a1d311b772b3207dca48b607c7126507 Mon Sep 17 00:00:00 2001 From: markus schnalke Date: Tue, 27 Mar 2012 15:07:59 +0200 Subject: [PATCH] Fixed two fd leaks in mhparse.c. 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 | 66 +++++++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 48 insertions(+), 18 deletions(-) diff --git a/uip/mhparse.c b/uip/mhparse.c index d38f251..bf65480 100644 --- a/uip/mhparse.c +++ b/uip/mhparse.c @@ -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; } -- 1.7.10.4