From e170a31c57b61eb40878bf28a850b2b492947ee8 Mon Sep 17 00:00:00 2001
From: Eli Zaretskii <eliz@gnu.org>
Date: Sun, 31 Oct 2021 16:20:27 +0200
Subject: [PATCH] Avoid signaling errors in lookup-key

* src/keymap.c (Flookup_key): Handle KEY vectors where not all
components are symbols.  (Bug#51527)  Do not merge to master.
---
 src/keymap.c | 38 ++++++++++++++++++++++----------------
 1 file changed, 22 insertions(+), 16 deletions(-)

diff --git a/src/keymap.c b/src/keymap.c
index 50f896d17cf..28ff71c01da 100644
--- a/src/keymap.c
+++ b/src/keymap.c
@@ -1259,22 +1259,28 @@ recognize the default bindings, just as `read-key-sequence' does.  */)
       Lisp_Object new_key = make_vector (key_len, Qnil);
       for (int i = 0; i < key_len; ++i)
 	{
-	  Lisp_Object sym = Fsymbol_name (AREF (key, i));
-	  USE_SAFE_ALLOCA;
-	  unsigned char *dst = SAFE_ALLOCA (SBYTES (sym) + 1);
-	  memcpy (dst, SSDATA (sym), SBYTES (sym));
-	  /* We can walk the string data byte by byte, because UTF-8
-	     encoding ensures that no other byte of any multibyte
-	     sequence will ever include a 7-bit byte equal to an ASCII
-	     single-byte character.  */
-	  for (int j = 0; j < SBYTES (sym); ++j)
-	    if (dst[j] >= 'A' && dst[j] <= 'Z')
-	      dst[j] += 'a' - 'A';  /* Convert to lower case.  */
-	  ASET (new_key, i, Fintern (make_multibyte_string ((char *) dst,
-							    SCHARS (sym),
-							    SBYTES (sym)),
-				     Qnil));
-	  SAFE_FREE ();
+	  Lisp_Object item = AREF (key, i);
+	  if (!SYMBOLP (item))
+	    ASET (new_key, i, item);
+	  else
+	    {
+	      Lisp_Object sym = Fsymbol_name (item);
+	      USE_SAFE_ALLOCA;
+	      unsigned char *dst = SAFE_ALLOCA (SBYTES (sym) + 1);
+	      memcpy (dst, SSDATA (sym), SBYTES (sym));
+	      /* We can walk the string data byte by byte, because
+		 UTF-8 encoding ensures that no other byte of any
+		 multibyte sequence will ever include a 7-bit byte
+		 equal to an ASCII single-byte character.  */
+	      for (int j = 0; j < SBYTES (sym); ++j)
+		if (dst[j] >= 'A' && dst[j] <= 'Z')
+		  dst[j] += 'a' - 'A';  /* Convert to lower case.  */
+	      ASET (new_key, i, Fintern (make_multibyte_string ((char *) dst,
+								SCHARS (sym),
+								SBYTES (sym)),
+					 Qnil));
+	      SAFE_FREE ();
+	    }
 	}
       found = lookup_key_1 (keymap, new_key, accept_default);
     }
-- 
2.39.5