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); }