changeset 5857:6ec4964c1687

Be more careful about echo_buf arithmetic, event-stream.c. src/ChangeLog addition: 2015-03-12 Aidan Kehoe <kehoea@parhasard.net> * event-stream.c (lookup_command_event): Check whether echo_buf_fill_pointer is negative before using it in arithmetic, avoiding a crash in GC. Oddly the old code didn't do this check and didn't crash, but its echo_buf was from malloced memory, not from our string data, so there may have been more room to manoeuvre.
author Aidan Kehoe <kehoea@parhasard.net>
date Thu, 12 Mar 2015 23:31:42 +0000
parents 27876789edc5
children 36934833b4f3
files src/ChangeLog src/event-stream.c
diffstat 2 files changed, 14 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/src/ChangeLog	Thu Mar 12 00:59:27 2015 +0000
+++ b/src/ChangeLog	Thu Mar 12 23:31:42 2015 +0000
@@ -1,3 +1,12 @@
+2015-03-12  Aidan Kehoe  <kehoea@parhasard.net>
+
+	* event-stream.c (lookup_command_event):
+	Check whether echo_buf_fill_pointer is negative before using it in
+	arithmetic, avoiding a crash in GC.
+	Oddly the old code didn't do this check and didn't crash, but its
+	echo_buf was from malloced memory, not from our string data, so
+	there may have been more room to manoeuvre.
+
 2015-03-04  Aidan Kehoe  <kehoea@parhasard.net>
 
 	* sequence.c (count_with_tail):
--- a/src/event-stream.c	Thu Mar 12 00:59:27 2015 +0000
+++ b/src/event-stream.c	Thu Mar 12 23:31:42 2015 +0000
@@ -4067,10 +4067,11 @@
 #endif
 	  {
 	    Lisp_Object prompt = Fkeymap_prompt (leaf, Qt);
-	    if (STRINGP (prompt))
+	    if (STRINGP (prompt) && STRINGP (command_builder->echo_buf))
 	      {
 		/* Append keymap prompt to key echo buffer */
-		int buf_fill_pointer = command_builder->echo_buf_fill_pointer;
+		Bytecount buf_fill_pointer
+                  = max (command_builder->echo_buf_fill_pointer, 0);
 		Bytecount len = XSTRING_LENGTH (prompt);
 
 		if (len + buf_fill_pointer + 1
@@ -4090,7 +4091,8 @@
                     /* Show the keymap prompt, but don't adjust the fill
                        pointer to reflect it. */
                     command_builder->echo_buf_end
-                      = command_builder->echo_buf_fill_pointer + len;
+                      = buf_fill_pointer + len;
+                    command_builder->echo_buf_fill_pointer = buf_fill_pointer;
 		  }
 		maybe_echo_keys (command_builder, 1);
 	      }