Module Name: src
Committed By: christos
Date: Sat Jun 29 14:09:35 UTC 2024
Modified Files:
src/lib/libedit: emacs.c
Log Message:
Retrieve the cursor position after calling c_insert, because c_insert could
enlarge the line buffer making the old cursor position point to freed memory.
>From Robert Morris https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=279772
To generate a diff of this commit:
cvs rdiff -u -r1.36 -r1.37 src/lib/libedit/emacs.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/emacs.c
diff -u src/lib/libedit/emacs.c:1.36 src/lib/libedit/emacs.c:1.37
--- src/lib/libedit/emacs.c:1.36 Mon May 9 17:46:56 2016
+++ src/lib/libedit/emacs.c Sat Jun 29 10:09:35 2024
@@ -1,4 +1,4 @@
-/* $NetBSD: emacs.c,v 1.36 2016/05/09 21:46:56 christos Exp $ */
+/* $NetBSD: emacs.c,v 1.37 2024/06/29 14:09:35 christos Exp $ */
/*-
* Copyright (c) 1992, 1993
@@ -37,7 +37,7 @@
#if 0
static char sccsid[] = "@(#)emacs.c 8.1 (Berkeley) 6/4/93";
#else
-__RCSID("$NetBSD: emacs.c,v 1.36 2016/05/09 21:46:56 christos Exp $");
+__RCSID("$NetBSD: emacs.c,v 1.37 2024/06/29 14:09:35 christos Exp $");
#endif
#endif /* not lint && not SCCSID */
@@ -134,11 +134,11 @@ em_yank(EditLine *el, wint_t c __attribu
return CC_ERROR;
el->el_chared.c_kill.mark = el->el_line.cursor;
- cp = el->el_line.cursor;
/* open the space, */
c_insert(el,
(int)(el->el_chared.c_kill.last - el->el_chared.c_kill.buf));
+ cp = el->el_line.cursor;
/* copy the chars */
for (kp = el->el_chared.c_kill.buf; kp < el->el_chared.c_kill.last; kp++)
*cp++ = *kp;
@@ -448,12 +448,12 @@ em_copy_prev_word(EditLine *el, wint_t c
if (el->el_line.cursor == el->el_line.buffer)
return CC_ERROR;
- oldc = el->el_line.cursor;
/* does a bounds check */
cp = c__prev_word(el->el_line.cursor, el->el_line.buffer,
el->el_state.argument, ce__isword);
c_insert(el, (int)(oldc - cp));
+ oldc = el->el_line.cursor;
for (dp = oldc; cp < oldc && dp < el->el_line.lastchar; cp++)
*dp++ = *cp;