Hi,
back in OpenBSD 5.0 times, there was a merge with NetBSD's libedit. It
was supposed to retain local modifications, but unfortunately they got
lost. In el.c, they got reintroduced with revision 1.18, but the
following ones are still lost:
history.c: revision 1.13
term.c: revision 1.13
Tobias
Index: history.c
===================================================================
RCS file: /var/www/cvs/src/lib/libedit/history.c,v
retrieving revision 1.16
diff -u -p -r1.16 history.c
--- history.c 7 Jul 2011 05:40:42 -0000 1.16
+++ history.c 18 Jan 2014 12:38:38 -0000
@@ -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 cha
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 cha
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 cha
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 cha
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 cha
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);
Index: term.c
===================================================================
RCS file: /var/www/cvs/src/lib/libedit/term.c,v
retrieving revision 1.15
diff -u -p -r1.15 term.c
--- term.c 7 Jul 2011 05:40:42 -0000 1.15
+++ term.c 18 Jan 2014 12:17:52 -0000
@@ -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);
}