diff options
| author | Paul Eggert | 2011-10-10 23:42:38 -0700 |
|---|---|---|
| committer | Paul Eggert | 2011-10-10 23:42:38 -0700 |
| commit | d44287d4adc1e268ef9974ea72010f0186f40197 (patch) | |
| tree | 6f569186f6bb6f789ef9b1cce64b0086ba1ecd30 | |
| parent | 58c8a77dd99a19052bf813198db4257865d32ac8 (diff) | |
| download | emacs-d44287d4adc1e268ef9974ea72010f0186f40197.tar.gz emacs-d44287d4adc1e268ef9974ea72010f0186f40197.zip | |
* 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.
| -rw-r--r-- | src/ChangeLog | 7 | ||||
| -rw-r--r-- | src/process.c | 59 |
2 files changed, 33 insertions, 33 deletions
diff --git a/src/ChangeLog b/src/ChangeLog index 232475c2af5..00845a4c188 100644 --- a/src/ChangeLog +++ b/src/ChangeLog | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | 2011-10-08 Paul Eggert <eggert@cs.ucla.edu> | 1 | 2011-10-11 Paul Eggert <eggert@cs.ucla.edu> |
| 2 | 2 | ||
| 3 | Fix integer width and related issues. | 3 | Fix integer width and related issues. |
| 4 | * alloc.c (pure_bytes_used_lisp, pure_bytes_used_non_lisp): | 4 | * alloc.c (pure_bytes_used_lisp, pure_bytes_used_non_lisp): |
| @@ -556,8 +556,11 @@ | |||
| 556 | * process.c (Fdelete_process): Don't assume pid fits into EMACS_INT. | 556 | * process.c (Fdelete_process): Don't assume pid fits into EMACS_INT. |
| 557 | (Fset_process_window_size, Fformat_network_address) | 557 | (Fset_process_window_size, Fformat_network_address) |
| 558 | (get_lisp_to_sockaddr_size, set_socket_option, Fmake_network_process) | 558 | (get_lisp_to_sockaddr_size, set_socket_option, Fmake_network_process) |
| 559 | (Fsignal_process, sigchld_handler): | 559 | (sigchld_handler): |
| 560 | Check that fixnums are in proper range for system types. | 560 | Check that fixnums are in proper range for system types. |
| 561 | (Fsignal_process): Simplify by avoiding a goto. | ||
| 562 | Treat out-of-range process numbers just like invalid numbers | ||
| 563 | that fit into the pid_t range, and return -1. | ||
| 561 | (Fformat_network_address, read_process_output, send_process) | 564 | (Fformat_network_address, read_process_output, send_process) |
| 562 | (Fprocess_send_region, status_notify): | 565 | (Fprocess_send_region, status_notify): |
| 563 | Use ptrdiff_t, not EMACS_INT, where ptrdiff_t is wide enough. | 566 | Use ptrdiff_t, not EMACS_INT, where ptrdiff_t is wide enough. |
diff --git a/src/process.c b/src/process.c index ab01728e215..ea433d2c373 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. */) | |||
| 5958 | { | 5958 | { |
| 5959 | pid_t pid; | 5959 | pid_t pid; |
| 5960 | 5960 | ||
| 5961 | if (INTEGERP (process)) | ||
| 5962 | { | ||
| 5963 | CHECK_TYPE_RANGED_INTEGER (pid_t, process); | ||
| 5964 | pid = XINT (process); | ||
| 5965 | goto got_it; | ||
| 5966 | } | ||
| 5967 | |||
| 5968 | if (FLOATP (process)) | ||
| 5969 | { | ||
| 5970 | double v = XFLOAT_DATA (process); | ||
| 5971 | if (! (TYPE_MINIMUM (pid_t) <= v && v < TYPE_MAXIMUM (pid_t) + 1.0)) | ||
| 5972 | args_out_of_range_3 (process, | ||
| 5973 | make_fixnum_or_float (TYPE_MINIMUM (pid_t)), | ||
| 5974 | make_fixnum_or_float (TYPE_MAXIMUM (pid_t))); | ||
| 5975 | pid = v; | ||
| 5976 | goto got_it; | ||
| 5977 | } | ||
| 5978 | |||
| 5979 | if (STRINGP (process)) | 5961 | if (STRINGP (process)) |
| 5980 | { | 5962 | { |
| 5981 | Lisp_Object tem = Fget_process (process); | 5963 | Lisp_Object tem = Fget_process (process); |
| 5982 | if (NILP (tem)) | 5964 | if (NILP (tem)) |
| 5983 | { | 5965 | { |
| 5984 | EMACS_INT v = XINT (Fstring_to_number (process, make_number (10))); | 5966 | Lisp_Object process_number = |
| 5985 | if (0 < v && v <= TYPE_MAXIMUM (pid_t)) | 5967 | string_to_number (SSDATA (process), 10, 1); |
| 5986 | { | 5968 | if (INTEGERP (process_number) || FLOATP (process_number)) |
| 5987 | pid = v; | 5969 | tem = process_number; |
| 5988 | goto got_it; | ||
| 5989 | } | ||
| 5990 | } | 5970 | } |
| 5991 | process = tem; | 5971 | process = tem; |
| 5992 | } | 5972 | } |
| 5993 | else | 5973 | else if (!NUMBERP (process)) |
| 5994 | process = get_process (process); | 5974 | process = get_process (process); |
| 5995 | 5975 | ||
| 5996 | if (NILP (process)) | 5976 | if (NILP (process)) |
| 5997 | return process; | 5977 | return process; |
| 5998 | 5978 | ||
| 5999 | CHECK_PROCESS (process); | 5979 | if (INTEGERP (process)) |
| 6000 | pid = XPROCESS (process)->pid; | 5980 | { |
| 6001 | if (pid <= 0) | 5981 | EMACS_INT v = XINT (process); |
| 6002 | error ("Cannot signal process %s", SDATA (XPROCESS (process)->name)); | 5982 | if (! (TYPE_MINIMUM (pid_t) <= v && v <= TYPE_MAXIMUM (pid_t))) |
| 6003 | 5983 | return make_number (-1); | |
| 6004 | got_it: | 5984 | pid = v; |
| 5985 | } | ||
| 5986 | else if (FLOATP (process)) | ||
| 5987 | { | ||
| 5988 | double v = XFLOAT_DATA (process); | ||
| 5989 | if (! (TYPE_MINIMUM (pid_t) <= v && v < TYPE_MAXIMUM (pid_t) + 1.0)) | ||
| 5990 | return make_number (-1); | ||
| 5991 | pid = v; | ||
| 5992 | if (pid != v) | ||
| 5993 | return make_number (-1); | ||
| 5994 | } | ||
| 5995 | else | ||
| 5996 | { | ||
| 5997 | CHECK_PROCESS (process); | ||
| 5998 | pid = XPROCESS (process)->pid; | ||
| 5999 | if (pid <= 0) | ||
| 6000 | error ("Cannot signal process %s", SDATA (XPROCESS (process)->name)); | ||
| 6001 | } | ||
| 6005 | 6002 | ||
| 6006 | #define parse_signal(NAME, VALUE) \ | 6003 | #define parse_signal(NAME, VALUE) \ |
| 6007 | else if (!xstrcasecmp (name, NAME)) \ | 6004 | else if (!xstrcasecmp (name, NAME)) \ |