Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/lib/libedit PR/45843: Henning Petersen: Fix resource leak on...



details:   https://anonhg.NetBSD.org/src/rev/9c753253acaa
branches:  trunk
changeset: 772784:9c753253acaa
user:      christos <christos%NetBSD.org@localhost>
date:      Mon Jan 16 14:57:45 2012 +0000

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

diffstat:

 lib/libedit/vi.c |  33 +++++++++++++++------------------
 1 files changed, 15 insertions(+), 18 deletions(-)

diffs (77 lines):

diff -r 893b427d10c2 -r 9c753253acaa lib/libedit/vi.c
--- a/lib/libedit/vi.c  Mon Jan 16 14:44:07 2012 +0000
+++ b/lib/libedit/vi.c  Mon Jan 16 14:57:45 2012 +0000
@@ -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 @@
        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 @@
        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 @@
        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 @@
        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():



Home | Main Index | Thread Index | Old Index