]> git.eshelyaron.com Git - emacs.git/commitdiff
Fix valgrind report in call-interactively
authorEli Zaretskii <eliz@gnu.org>
Sat, 6 Jan 2018 16:23:52 +0000 (18:23 +0200)
committerEli Zaretskii <eliz@gnu.org>
Sat, 6 Jan 2018 16:23:52 +0000 (18:23 +0200)
* src/callint.c (Fcall_interactively): Don't try to access more
bytes than are available in the interactive spec.  (Bug#30004)

src/callint.c

index ef228517f170fec32f6b7524731bb48ccc327ee8..e4491e9085a81b7a73696167956bae5a8a3005b7 100644 (file)
@@ -774,10 +774,23 @@ invoke it.  If KEYS is omitted or nil, the return value of
             if anyone tries to define one here.  */
        case '+':
        default:
-         error ("Invalid control letter `%c' (#o%03o, #x%04x) in interactive calling string",
-                STRING_CHAR ((unsigned char *) tem),
-                (unsigned) STRING_CHAR ((unsigned char *) tem),
-                (unsigned) STRING_CHAR ((unsigned char *) tem));
+         {
+           /* How many bytes are left unprocessed in the specs string?
+              (Note that this excludes the trailing null byte.)  */
+           ptrdiff_t bytes_left = SBYTES (specs) - (tem - string);
+           unsigned letter;
+
+           /* If we have enough bytes left to treat the sequence as a
+              character, show that character's codepoint; otherwise
+              show only its first byte.  */
+           if (bytes_left >= BYTES_BY_CHAR_HEAD (*((unsigned char *) tem)))
+             letter = STRING_CHAR ((unsigned char *) tem);
+           else
+             letter = *((unsigned char *) tem);
+
+           error ("Invalid control letter `%c' (#o%03o, #x%04x) in interactive calling string",
+                  (int) letter, letter, letter);
+         }
        }
 
       if (varies[i] == 0)