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

Reply via email to