From d44287d4adc1e268ef9974ea72010f0186f40197 Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Mon, 10 Oct 2011 23:42:38 -0700 Subject: [PATCH] * process.c (Fsignal_process): Simplify by avoiding a goto. Treat out-of-range process numbers just like invalid numbers that fit into the pid_t range, and return -1. --- src/ChangeLog | 7 ++++-- src/process.c | 59 ++++++++++++++++++++++++--------------------------- 2 files changed, 33 insertions(+), 33 deletions(-) diff --git a/src/ChangeLog b/src/ChangeLog index 232475c2af..00845a4c18 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,4 +1,4 @@ -2011-10-08 Paul Eggert +2011-10-11 Paul Eggert Fix integer width and related issues. * alloc.c (pure_bytes_used_lisp, pure_bytes_used_non_lisp): @@ -556,8 +556,11 @@ * process.c (Fdelete_process): Don't assume pid fits into EMACS_INT. (Fset_process_window_size, Fformat_network_address) (get_lisp_to_sockaddr_size, set_socket_option, Fmake_network_process) - (Fsignal_process, sigchld_handler): + (sigchld_handler): Check that fixnums are in proper range for system types. + (Fsignal_process): Simplify by avoiding a goto. + Treat out-of-range process numbers just like invalid numbers + that fit into the pid_t range, and return -1. (Fformat_network_address, read_process_output, send_process) (Fprocess_send_region, status_notify): Use ptrdiff_t, not EMACS_INT, where ptrdiff_t is wide enough. diff --git a/src/process.c b/src/process.c index ab01728e21..ea433d2c37 100644 --- a/src/process.c +++ b/src/process.c @@ -5958,50 +5958,47 @@ SIGCODE may be an integer, or a symbol whose name is a signal name. */) { pid_t pid; - if (INTEGERP (process)) - { - CHECK_TYPE_RANGED_INTEGER (pid_t, process); - pid = XINT (process); - goto got_it; - } - - if (FLOATP (process)) - { - double v = XFLOAT_DATA (process); - if (! (TYPE_MINIMUM (pid_t) <= v && v < TYPE_MAXIMUM (pid_t) + 1.0)) - args_out_of_range_3 (process, - make_fixnum_or_float (TYPE_MINIMUM (pid_t)), - make_fixnum_or_float (TYPE_MAXIMUM (pid_t))); - pid = v; - goto got_it; - } - if (STRINGP (process)) { Lisp_Object tem = Fget_process (process); if (NILP (tem)) { - EMACS_INT v = XINT (Fstring_to_number (process, make_number (10))); - if (0 < v && v <= TYPE_MAXIMUM (pid_t)) - { - pid = v; - goto got_it; - } + Lisp_Object process_number = + string_to_number (SSDATA (process), 10, 1); + if (INTEGERP (process_number) || FLOATP (process_number)) + tem = process_number; } process = tem; } - else + else if (!NUMBERP (process)) process = get_process (process); if (NILP (process)) return process; - CHECK_PROCESS (process); - pid = XPROCESS (process)->pid; - if (pid <= 0) - error ("Cannot signal process %s", SDATA (XPROCESS (process)->name)); - - got_it: + if (INTEGERP (process)) + { + EMACS_INT v = XINT (process); + if (! (TYPE_MINIMUM (pid_t) <= v && v <= TYPE_MAXIMUM (pid_t))) + return make_number (-1); + pid = v; + } + else if (FLOATP (process)) + { + double v = XFLOAT_DATA (process); + if (! (TYPE_MINIMUM (pid_t) <= v && v < TYPE_MAXIMUM (pid_t) + 1.0)) + return make_number (-1); + pid = v; + if (pid != v) + return make_number (-1); + } + else + { + CHECK_PROCESS (process); + pid = XPROCESS (process)->pid; + if (pid <= 0) + error ("Cannot signal process %s", SDATA (XPROCESS (process)->name)); + } #define parse_signal(NAME, VALUE) \ else if (!xstrcasecmp (name, NAME)) \ -- 2.20.1