From: Robert Pluim Date: Mon, 20 Jan 2025 17:43:00 +0000 (+0100) Subject: Signal error when keyword/arg list is malformed X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=2d942f3a5cfd90802b13032d7dedc0c5a23bf5d7;p=emacs.git Signal error when keyword/arg list is malformed * 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) --- diff --git a/src/data.c b/src/data.c index 077719c4062..dcaa5756ebe 100644 --- a/src/data.c +++ b/src/data.c @@ -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"); diff --git a/src/lisp.h b/src/lisp.h index 8b870119315..28fa4c8037e 100644 --- a/src/lisp.h +++ b/src/lisp.h @@ -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); diff --git a/src/process.c b/src/process.c index cd1149ae8b0..275e86f31d0 100644 --- a/src/process.c +++ b/src/process.c @@ -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); diff --git a/src/sound.c b/src/sound.c index 67a1e99e31c..5e6acdb4743 100644 --- a/src/sound.c +++ b/src/sound.c @@ -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); diff --git a/src/w32fns.c b/src/w32fns.c index c2551ea2378..225a3a0999e 100644 --- a/src/w32fns.c +++ b/src/w32fns.c @@ -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);