summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lib/libedit/history.c32
-rw-r--r--lib/libedit/term.c43
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);
}