Module Name:    src
Committed By:   christos
Date:           Mon Jan 16 14:57:46 UTC 2012

Modified Files:
        src/lib/libedit: vi.c

Log Message:
PR/45843: Henning Petersen: Fix resource leak on error.


To generate a diff of this commit:
cvs rdiff -u -r1.42 -r1.43 src/lib/libedit/vi.c

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

Modified files:

Index: src/lib/libedit/vi.c
diff -u src/lib/libedit/vi.c:1.42 src/lib/libedit/vi.c:1.43
--- src/lib/libedit/vi.c:1.42	Fri Nov 18 15:24:21 2011
+++ src/lib/libedit/vi.c	Mon Jan 16 09:57:45 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: vi.c,v 1.42 2011/11/18 20:24:21 christos Exp $	*/
+/*	$NetBSD: vi.c,v 1.43 2012/01/16 14:57:45 christos Exp $	*/
 
 /*-
  * Copyright (c) 1992, 1993
@@ -42,7 +42,7 @@
 #if 0
 static char sccsid[] = "@(#)vi.c	8.1 (Berkeley) 6/4/93";
 #else
-__RCSID("$NetBSD: vi.c,v 1.42 2011/11/18 20:24:21 christos Exp $");
+__RCSID("$NetBSD: vi.c,v 1.43 2012/01/16 14:57:45 christos Exp $");
 #endif
 #endif /* not lint && not SCCSID */
 
@@ -1006,9 +1006,9 @@ vi_histedit(EditLine *el, Int c __attrib
 	ssize_t st;
 	int status;
 	char tempfile[] = "/tmp/histedit.XXXXXXXXXX";
-	char *cp;
+	char *cp = NULL;
 	size_t len;
-	Char *line;
+	Char *line = NULL;
 
 	if (el->el_state.doingarg) {
 		if (vi_to_history_line(el, 0) == CC_ERROR)
@@ -1021,16 +1021,11 @@ vi_histedit(EditLine *el, Int c __attrib
 	len = (size_t)(el->el_line.lastchar - el->el_line.buffer);
 #define TMP_BUFSIZ (EL_BUFSIZ * MB_LEN_MAX)
 	cp = el_malloc(TMP_BUFSIZ * sizeof(*cp));
-	if (cp == NULL) {
-		unlink(tempfile);
-		close(fd);
-		return CC_ERROR;
-	}
+	if (cp == NULL)
+		goto error;
 	line = el_malloc(len * sizeof(*line) + 1);
-	if (line == NULL) {
-		el_free(cp);
-		return CC_ERROR;
-	}
+	if (line == NULL)
+		goto error;
 	Strncpy(line, el->el_line.buffer, len);
 	line[len] = '\0';
 	ct_wcstombs(cp, line, TMP_BUFSIZ - 1);
@@ -1041,11 +1036,7 @@ vi_histedit(EditLine *el, Int c __attrib
 	pid = fork();
 	switch (pid) {
 	case -1:
-		close(fd);
-		unlink(tempfile);
-		el_free(cp);
-                el_free(line);
-		return CC_ERROR;
+		goto error;
 	case 0:
 		close(fd);
 		execlp("vi", "vi", tempfile, (char *)NULL);
@@ -1076,6 +1067,12 @@ vi_histedit(EditLine *el, Int c __attrib
 	unlink(tempfile);
 	/* return CC_REFRESH; */
 	return ed_newline(el, 0);
+error:
+	el_free(line);
+	el_free(cp);
+	close(fd);
+	unlink(tempfile);
+	return CC_ERROR;
 }
 
 /* vi_history_word():

Reply via email to