diff options
-rw-r--r-- | lib/libedit/history.c | 32 | ||||
-rw-r--r-- | lib/libedit/term.c | 43 |
2 files changed, 50 insertions, 25 deletions
diff --git a/lib/libedit/history.c b/lib/libedit/history.c index d71e4632644..76b0d70bc0c 100644 --- a/lib/libedit/history.c +++ b/lib/libedit/history.c @@ -1,4 +1,4 @@ -/* $OpenBSD: history.c,v 1.16 2011/07/07 05:40:42 okan Exp $ */ +/* $OpenBSD: history.c,v 1.17 2014/01/19 11:48:54 tobias Exp $ */ /* $NetBSD: history.c,v 1.37 2010/01/03 18:27:10 christos Exp $ */ /*- @@ -724,7 +724,7 @@ private int history_load(TYPE(History) *h, const char *fname) { FILE *fp; - char *line; + char *line, *lbuf; size_t sz, max_size; char *ptr; int i = -1; @@ -733,6 +733,7 @@ history_load(TYPE(History) *h, const char *fname) static ct_buffer_t conv; #endif + lbuf = NULL; if ((fp = fopen(fname, "r")) == NULL) return (i); @@ -746,14 +747,19 @@ history_load(TYPE(History) *h, const char *fname) if (ptr == NULL) goto done; for (i = 0; (line = fgetln(fp, &sz)) != NULL; i++) { - char c = line[sz]; - - if (sz != 0 && line[sz - 1] == '\n') - line[--sz] = '\0'; - else - line[sz] = '\0'; - - if (max_size < sz) { + if (line[sz - 1] == '\n') + line[sz - 1] = '\0'; + else { + lbuf = malloc(sz + 1); + if (lbuf == NULL) { + i = -1; + goto oomem; + } + memcpy(lbuf, line, sz); + lbuf[sz++] = '\0'; + line = lbuf; + } + if (sz > max_size) { char *nptr; max_size = (sz + 1024) & ~1023; nptr = h_realloc(ptr, max_size); @@ -764,7 +770,6 @@ history_load(TYPE(History) *h, const char *fname) ptr = nptr; } (void) strunvis(ptr, line); - line[sz] = c; if (HENTER(h, &ev, ct_decode_string(ptr, &conv)) == -1) { i = -1; goto oomem; @@ -773,6 +778,7 @@ history_load(TYPE(History) *h, const char *fname) oomem: h_free((ptr_t)ptr); done: + h_free(lbuf); (void) fclose(fp); return (i); } @@ -806,8 +812,8 @@ history_save(TYPE(History) *h, const char *fname) for (i = 0, retval = HLAST(h, &ev); retval != -1; retval = HPREV(h, &ev), i++) { - len = Strlen(ev.str) * 4; - if (len >= max_size) { + len = Strlen(ev.str) * 4 + 1; + if (len > max_size) { char *nptr; max_size = (len + 1024) & ~1023; nptr = h_realloc(ptr, max_size); diff --git a/lib/libedit/term.c b/lib/libedit/term.c index e6d6cadd355..4606e95b0b1 100644 --- a/lib/libedit/term.c +++ b/lib/libedit/term.c @@ -1,4 +1,4 @@ -/* $OpenBSD: term.c,v 1.15 2011/07/07 05:40:42 okan Exp $ */ +/* $OpenBSD: term.c,v 1.16 2014/01/19 11:48:54 tobias Exp $ */ /* $NetBSD: term.c,v 1.57 2009/12/30 22:37:40 christos Exp $ */ /*- @@ -333,25 +333,39 @@ term_init(EditLine *el) el->el_term.t_buf = (char *) el_malloc(TC_BUFSIZE); if (el->el_term.t_buf == NULL) - return (-1); + goto fail; el->el_term.t_cap = (char *) el_malloc(TC_BUFSIZE); if (el->el_term.t_cap == NULL) - return (-1); + goto fail2; el->el_term.t_fkey = (fkey_t *) el_malloc(A_K_NKEYS * sizeof(fkey_t)); if (el->el_term.t_fkey == NULL) - return (-1); + goto fail3; el->el_term.t_loc = 0; el->el_term.t_str = (char **) el_malloc(T_str * sizeof(char *)); if (el->el_term.t_str == NULL) - return (-1); + goto fail4; (void) memset(el->el_term.t_str, 0, T_str * sizeof(char *)); el->el_term.t_val = (int *) el_malloc(T_val * sizeof(int)); if (el->el_term.t_val == NULL) - return (-1); + goto fail5; (void) memset(el->el_term.t_val, 0, T_val * sizeof(int)); (void) term_set(el, NULL); term_init_arrow(el); return (0); +fail5: + el_free(el->el_term.t_str); + el->el_term.t_str = NULL; +fail4: + el_free(el->el_term.t_fkey); + el->el_term.t_fkey = NULL; +fail3: + el_free(el->el_term.t_cap); + el->el_term.t_cap = NULL; +fail2: + el_free(el->el_term.t_buf); + el->el_term.t_buf = NULL; +fail: + return (-1); } /* term_end(): @@ -465,20 +479,20 @@ term_rebuffer_display(EditLine *el) private int term_alloc_display(EditLine *el) { - int i; + int i, rv = -1; Char **b; coord_t *c = &el->el_term.t_size; b = el_malloc(sizeof(*b) * (c->v + 1)); if (b == NULL) - return (-1); + goto done; for (i = 0; i < c->v; i++) { b[i] = el_malloc(sizeof(**b) * (c->h + 1)); if (b[i] == NULL) { while (--i >= 0) el_free((ptr_t) b[i]); el_free((ptr_t) b); - return (-1); + goto done; } } b[c->v] = NULL; @@ -486,19 +500,24 @@ term_alloc_display(EditLine *el) b = el_malloc(sizeof(*b) * (c->v + 1)); if (b == NULL) - return (-1); + goto done; for (i = 0; i < c->v; i++) { b[i] = el_malloc(sizeof(**b) * (c->h + 1)); if (b[i] == NULL) { while (--i >= 0) el_free((ptr_t) b[i]); el_free((ptr_t) b); - return (-1); + goto done; } } b[c->v] = NULL; el->el_vdisplay = b; - return (0); + + rv = 0; +done: + if (rv) + term_free_display(el); + return (rv); } |