Module Name:    src
Committed By:   rin
Date:           Tue Nov 21 02:11:44 UTC 2017

Modified Files:
        src/external/bsd/nvi/dist/common: conv.c

Log Message:
Fix resource leaks due to missing of iconv_close(3).


To generate a diff of this commit:
cvs rdiff -u -r1.8 -r1.9 src/external/bsd/nvi/dist/common/conv.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/external/bsd/nvi/dist/common/conv.c
diff -u src/external/bsd/nvi/dist/common/conv.c:1.8 src/external/bsd/nvi/dist/common/conv.c:1.9
--- src/external/bsd/nvi/dist/common/conv.c:1.8	Tue Nov 21 02:00:29 2017
+++ src/external/bsd/nvi/dist/common/conv.c	Tue Nov 21 02:11:44 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: conv.c,v 1.8 2017/11/21 02:00:29 rin Exp $ */
+/*	$NetBSD: conv.c,v 1.9 2017/11/21 02:11:44 rin Exp $ */
 /*-
  * Copyright (c) 1993, 1994
  *	The Regents of the University of California.  All rights reserved.
@@ -16,7 +16,7 @@
 static const char sccsid[] = "Id: conv.c,v 1.27 2001/08/18 21:41:41 skimo Exp  (Berkeley) Date: 2001/08/18 21:41:41 ";
 #endif /* not lint */
 #else
-__RCSID("$NetBSD: conv.c,v 1.8 2017/11/21 02:00:29 rin Exp $");
+__RCSID("$NetBSD: conv.c,v 1.9 2017/11/21 02:11:44 rin Exp $");
 #endif
 
 #include <sys/types.h>
@@ -151,7 +151,7 @@ default_char2int(SCR *sp, const char * s
 	j += n;
 	if (++i >= *blen) {
 	    nlen += 256;
-	    BINC_RETW(NULL, *tostr, *blen, nlen);
+	    BINC_GOTOW(NULL, *tostr, *blen, nlen);
 	}
 	if (id != (iconv_t)-1 && j == len && left) {
 	    CONVERT(str, left, src, len);
@@ -167,6 +167,7 @@ default_char2int(SCR *sp, const char * s
 
     return 0;
 err:
+alloc_err:
     *tolen = i;
     if (id != (iconv_t)-1)
 	iconv_close(id);
@@ -269,7 +270,7 @@ default_int2char(SCR *sp, const CHAR_T *
 	    char *obp = (char *)cw->bp1 + offset;		    	\
 	    if (cw->blen1 < offset + MB_CUR_MAX) {		    	\
 		nlen += 256;						\
-		BINC_RETC(NULL, cw->bp1, cw->blen1, nlen);		\
+		BINC_GOTOC(NULL, cw->bp1, cw->blen1, nlen);		\
 	    }						    		\
 	    errno = 0;						    	\
 	    ret = iconv(id, &bp, lenp, &obp, &outleft);			\
@@ -322,14 +323,18 @@ default_int2char(SCR *sp, const CHAR_T *
 	CONVERT2(buffer, &j, cw, offset);
 	CONVERT2(NULL, NULL, cw, offset);  /* back to the initial state */
 	*tolen = offset;
+	iconv_close(id);
     }
 
     *pdst = cw->bp1;
 
     return 0;
 err:
+alloc_err:
     *tolen = j;
-
+    if (id != (iconv_t)-1) {
+	iconv_close(id);
+    }
     *pdst = cw->bp1;
 
     return 1;

Reply via email to