]> git.eshelyaron.com Git - emacs.git/commitdiff
Signal error when keyword/arg list is malformed
authorRobert Pluim <rpluim@gmail.com>
Mon, 20 Jan 2025 17:43:00 +0000 (18:43 +0100)
committerEshel Yaron <me@eshelyaron.com>
Thu, 23 Jan 2025 10:24:35 +0000 (11:24 +0100)
* src/data.c (syms_of_data): Add Qmalformed_keyword_arg_list
error symbol.

* src/process.c (Fmake_process, Fmake_pipe_process)
(Fserial_process_configure, Fmake_serial_process)
(Fmake_network_process): Signal Qmalformed_keyword_arg_list when
the argument list length is odd.
* src/sound.c (parse_sound): Also here..
* src/w32fns.c (Fw32_notification_notify): ..and here.

(Bug#75584)

(cherry picked from commit 14e686e6cca83054afceb353ad7a1e24ebdb0133)

src/data.c
src/lisp.h
src/process.c
src/sound.c
src/w32fns.c

index 077719c4062190525d7afe3b35ad56e0dc19c575..dcaa5756ebe53856722d75535468ca6394246663 100644 (file)
@@ -4020,6 +4020,7 @@ syms_of_data (void)
 
   DEFSYM (Qinvalid_function, "invalid-function");
   DEFSYM (Qwrong_number_of_arguments, "wrong-number-of-arguments");
+  DEFSYM (Qmalformed_keyword_arg_list, "malformed-keyword-arg-list");
   DEFSYM (Qno_catch, "no-catch");
   DEFSYM (Qend_of_file, "end-of-file");
   DEFSYM (Qarith_error, "arith-error");
@@ -4119,6 +4120,8 @@ syms_of_data (void)
   PUT_ERROR (Qinvalid_function, error_tail, "Invalid function");
   PUT_ERROR (Qwrong_number_of_arguments, error_tail,
             "Wrong number of arguments");
+  PUT_ERROR (Qmalformed_keyword_arg_list, error_tail,
+            "Keyword lacks a corresponding value");
   PUT_ERROR (Qno_catch, error_tail, "No catch for tag");
   PUT_ERROR (Qend_of_file, error_tail, "End of file during parsing");
 
index 8b870119315e6f4d5ef880b6728aa4527759458c..28fa4c8037e0ebeaa16824d6834c7ebbff34f725 100644 (file)
@@ -4911,6 +4911,15 @@ extern Lisp_Object safe_funcall (ptrdiff_t, Lisp_Object*);
 #define safe_calln(...) \
   CALLMANY (safe_funcall, ((Lisp_Object []) {__VA_ARGS__}))
 
+INLINE void
+CHECK_KEYWORD_ARGS (ptrdiff_t nargs)
+{
+  /* Used to check if a list of keyword/value pairs is missing a
+     value.  */
+  if (nargs & 1)
+    xsignal0 (Qmalformed_keyword_arg_list);
+}
+
 extern void init_eval (void);
 extern void syms_of_eval (void);
 extern void prog_ignore (Lisp_Object);
index cd1149ae8b04cf732b8047bc1cc2453beebfe306..275e86f31d0c62d26b56eff54fe6fb95b77c1c28 100644 (file)
@@ -1822,6 +1822,7 @@ usage: (make-process &rest ARGS)  */)
 
   if (nargs == 0)
     return Qnil;
+  CHECK_KEYWORD_ARGS (nargs);
 
   /* Save arguments for process-contact and clone-process.  */
   contact = Flist (nargs, args);
@@ -2431,6 +2432,7 @@ usage:  (make-pipe-process &rest ARGS)  */)
 
   if (nargs == 0)
     return Qnil;
+  CHECK_KEYWORD_ARGS (nargs);
 
   contact = Flist (nargs, args);
 
@@ -3066,6 +3068,8 @@ usage: (serial-process-configure &rest ARGS)  */)
   Lisp_Object contact = Qnil;
   Lisp_Object proc = Qnil;
 
+  CHECK_KEYWORD_ARGS (nargs);
+
   contact = Flist (nargs, args);
 
   proc = plist_get (contact, QCprocess);
@@ -3170,6 +3174,7 @@ usage:  (make-serial-process &rest ARGS)  */)
 
   if (nargs == 0)
     return Qnil;
+  CHECK_KEYWORD_ARGS (nargs);
 
   contact = Flist (nargs, args);
 
@@ -3971,6 +3976,7 @@ usage: (make-network-process &rest ARGS)  */)
 
   if (nargs == 0)
     return Qnil;
+  CHECK_KEYWORD_ARGS (nargs);
 
   /* Save arguments for process-contact and clone-process.  */
   contact = Flist (nargs, args);
index 67a1e99e31c09f60cc0a9293d969d995ce678d53..5e6acdb4743abe2a814eb1018b453dbc6ad5877c 100644 (file)
@@ -359,9 +359,11 @@ sound_warning (const char *msg)
 static bool
 parse_sound (Lisp_Object sound, Lisp_Object *attrs)
 {
-  /* SOUND must be a list starting with the symbol `sound'.  */
+  /* SOUND must be a list starting with the symbol `sound' followed by a
+     number of keyword/value argument pairs.  */
   if (!CONSP (sound) || !EQ (XCAR (sound), Qsound))
     return 0;
+  CHECK_KEYWORD_ARGS (list_length (sound) - 1);
 
   sound = XCDR (sound);
   attrs[SOUND_FILE] = plist_get (sound, QCfile);
index c2551ea2378e1331b3d1b8bfce24ff7b88260176..225a3a0999e330864686f247d389f5dd5f72113a 100644 (file)
@@ -10655,6 +10655,7 @@ usage: (w32-notification-notify &rest PARAMS)  */)
 
   if (nargs == 0 || !pfnShell_NotifyIconW)
     return Qnil;
+  CHECK_KEYWORD_ARGS (nargs);
 
   arg_plist = Flist (nargs, args);