Module Name:    src
Committed By:   christos
Date:           Sun Mar  5 17:30:38 UTC 2017

Modified Files:
        src/lib/libedit: hist.c

Log Message:
Grow the buffer for event search if there was not enough space.
>From Gerry Swislow


To generate a diff of this commit:
cvs rdiff -u -r1.30 -r1.31 src/lib/libedit/hist.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/lib/libedit/hist.c
diff -u src/lib/libedit/hist.c:1.30 src/lib/libedit/hist.c:1.31
--- src/lib/libedit/hist.c:1.30	Mon Nov  7 10:30:18 2016
+++ src/lib/libedit/hist.c	Sun Mar  5 12:30:38 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: hist.c,v 1.30 2016/11/07 15:30:18 christos Exp $	*/
+/*	$NetBSD: hist.c,v 1.31 2017/03/05 17:30:38 christos Exp $	*/
 
 /*-
  * Copyright (c) 1992, 1993
@@ -37,7 +37,7 @@
 #if 0
 static char sccsid[] = "@(#)hist.c	8.1 (Berkeley) 6/4/93";
 #else
-__RCSID("$NetBSD: hist.c,v 1.30 2016/11/07 15:30:18 christos Exp $");
+__RCSID("$NetBSD: hist.c,v 1.31 2017/03/05 17:30:38 christos Exp $");
 #endif
 #endif /* not lint && not SCCSID */
 
@@ -102,6 +102,7 @@ hist_get(EditLine *el)
 {
 	const wchar_t *hp;
 	int h;
+	size_t blen, hlen;
 
 	if (el->el_history.eventno == 0) {	/* if really the current line */
 		(void) wcsncpy(el->el_line.buffer, el->el_history.buf,
@@ -127,14 +128,16 @@ hist_get(EditLine *el)
 		return CC_ERROR;
 
 	for (h = 1; h < el->el_history.eventno; h++)
-		if ((hp = HIST_NEXT(el)) == NULL) {
-			el->el_history.eventno = h;
-			return CC_ERROR;
-		}
-	(void) wcsncpy(el->el_line.buffer, hp,
-			(size_t)(el->el_line.limit - el->el_line.buffer));
-	el->el_line.buffer[el->el_line.limit - el->el_line.buffer - 1] = '\0';
-	el->el_line.lastchar = el->el_line.buffer + wcslen(el->el_line.buffer);
+		if ((hp = HIST_NEXT(el)) == NULL)
+			goto out;
+
+	hlen = wcslen(hp);
+	blen = (size_t)(el->el_line.limit - el->el_line.buffer);
+	if (hlen > blen && !ch_enlargebufs(el, hlen))
+		goto out;
+
+	memcpy(el->el_line.buffer, hp, hlen * sizeof(*hp));
+	el->el_line.lastchar = el->el_line.buffer + hlen - 1;
 
 	if (el->el_line.lastchar > el->el_line.buffer
 	    && el->el_line.lastchar[-1] == '\n')
@@ -150,6 +153,10 @@ hist_get(EditLine *el)
 		el->el_line.cursor = el->el_line.lastchar;
 
 	return CC_REFRESH;
+out:
+	el->el_history.eventno = h;
+	return CC_ERROR;
+
 }
 
 

Reply via email to