diff options
Diffstat (limited to 'src/process.c')
| -rw-r--r-- | src/process.c | 27 |
1 files changed, 15 insertions, 12 deletions
diff --git a/src/process.c b/src/process.c index 0d6994bdab1..ef9f295fd89 100644 --- a/src/process.c +++ b/src/process.c | |||
| @@ -1386,9 +1386,10 @@ usage: (start-process NAME BUFFER PROGRAM &rest PROGRAM-ARGS) */) | |||
| 1386 | (ptrdiff_t nargs, Lisp_Object *args) | 1386 | (ptrdiff_t nargs, Lisp_Object *args) |
| 1387 | { | 1387 | { |
| 1388 | Lisp_Object buffer, name, program, proc, current_dir, tem; | 1388 | Lisp_Object buffer, name, program, proc, current_dir, tem; |
| 1389 | register unsigned char **new_argv; | 1389 | unsigned char **new_argv; |
| 1390 | ptrdiff_t i; | 1390 | ptrdiff_t i; |
| 1391 | ptrdiff_t count = SPECPDL_INDEX (); | 1391 | ptrdiff_t count = SPECPDL_INDEX (); |
| 1392 | USE_SAFE_ALLOCA; | ||
| 1392 | 1393 | ||
| 1393 | buffer = args[1]; | 1394 | buffer = args[1]; |
| 1394 | if (!NILP (buffer)) | 1395 | if (!NILP (buffer)) |
| @@ -1464,7 +1465,7 @@ usage: (start-process NAME BUFFER PROGRAM &rest PROGRAM-ARGS) */) | |||
| 1464 | val = Vcoding_system_for_read; | 1465 | val = Vcoding_system_for_read; |
| 1465 | if (NILP (val)) | 1466 | if (NILP (val)) |
| 1466 | { | 1467 | { |
| 1467 | args2 = alloca ((nargs + 1) * sizeof *args2); | 1468 | SAFE_ALLOCA_LISP (args2, nargs + 1); |
| 1468 | args2[0] = Qstart_process; | 1469 | args2[0] = Qstart_process; |
| 1469 | for (i = 0; i < nargs; i++) args2[i + 1] = args[i]; | 1470 | for (i = 0; i < nargs; i++) args2[i + 1] = args[i]; |
| 1470 | GCPRO2 (proc, current_dir); | 1471 | GCPRO2 (proc, current_dir); |
| @@ -1483,7 +1484,7 @@ usage: (start-process NAME BUFFER PROGRAM &rest PROGRAM-ARGS) */) | |||
| 1483 | { | 1484 | { |
| 1484 | if (EQ (coding_systems, Qt)) | 1485 | if (EQ (coding_systems, Qt)) |
| 1485 | { | 1486 | { |
| 1486 | args2 = alloca ((nargs + 1) * sizeof *args2); | 1487 | SAFE_ALLOCA_LISP (args2, nargs + 1); |
| 1487 | args2[0] = Qstart_process; | 1488 | args2[0] = Qstart_process; |
| 1488 | for (i = 0; i < nargs; i++) args2[i + 1] = args[i]; | 1489 | for (i = 0; i < nargs; i++) args2[i + 1] = args[i]; |
| 1489 | GCPRO2 (proc, current_dir); | 1490 | GCPRO2 (proc, current_dir); |
| @@ -1578,7 +1579,7 @@ usage: (start-process NAME BUFFER PROGRAM &rest PROGRAM-ARGS) */) | |||
| 1578 | 1579 | ||
| 1579 | /* Now that everything is encoded we can collect the strings into | 1580 | /* Now that everything is encoded we can collect the strings into |
| 1580 | NEW_ARGV. */ | 1581 | NEW_ARGV. */ |
| 1581 | new_argv = alloca ((nargs - 1) * sizeof *new_argv); | 1582 | SAFE_NALLOCA (new_argv, 1, nargs - 1); |
| 1582 | new_argv[nargs - 2] = 0; | 1583 | new_argv[nargs - 2] = 0; |
| 1583 | 1584 | ||
| 1584 | for (i = nargs - 2; i-- != 0; ) | 1585 | for (i = nargs - 2; i-- != 0; ) |
| @@ -1592,6 +1593,7 @@ usage: (start-process NAME BUFFER PROGRAM &rest PROGRAM-ARGS) */) | |||
| 1592 | else | 1593 | else |
| 1593 | create_pty (proc); | 1594 | create_pty (proc); |
| 1594 | 1595 | ||
| 1596 | SAFE_FREE (); | ||
| 1595 | return unbind_to (count, proc); | 1597 | return unbind_to (count, proc); |
| 1596 | } | 1598 | } |
| 1597 | 1599 | ||
| @@ -2071,8 +2073,10 @@ get_lisp_to_sockaddr_size (Lisp_Object address, int *familyp) | |||
| 2071 | && VECTORP (XCDR (address))) | 2073 | && VECTORP (XCDR (address))) |
| 2072 | { | 2074 | { |
| 2073 | struct sockaddr *sa; | 2075 | struct sockaddr *sa; |
| 2074 | *familyp = XINT (XCAR (address)); | ||
| 2075 | p = XVECTOR (XCDR (address)); | 2076 | p = XVECTOR (XCDR (address)); |
| 2077 | if (MAX_ALLOCA - sizeof sa->sa_family < p->header.size) | ||
| 2078 | return 0; | ||
| 2079 | *familyp = XINT (XCAR (address)); | ||
| 2076 | return p->header.size + sizeof (sa->sa_family); | 2080 | return p->header.size + sizeof (sa->sa_family); |
| 2077 | } | 2081 | } |
| 2078 | return 0; | 2082 | return 0; |
| @@ -4973,18 +4977,17 @@ read_and_dispose_of_process_output (struct Lisp_Process *p, char *chars, | |||
| 4973 | for decoding. */ | 4977 | for decoding. */ |
| 4974 | 4978 | ||
| 4975 | static int | 4979 | static int |
| 4976 | read_process_output (Lisp_Object proc, register int channel) | 4980 | read_process_output (Lisp_Object proc, int channel) |
| 4977 | { | 4981 | { |
| 4978 | register ssize_t nbytes; | 4982 | ssize_t nbytes; |
| 4979 | char *chars; | 4983 | struct Lisp_Process *p = XPROCESS (proc); |
| 4980 | register struct Lisp_Process *p = XPROCESS (proc); | ||
| 4981 | struct coding_system *coding = proc_decode_coding_system[channel]; | 4984 | struct coding_system *coding = proc_decode_coding_system[channel]; |
| 4982 | int carryover = p->decoding_carryover; | 4985 | int carryover = p->decoding_carryover; |
| 4983 | int readmax = 4096; | 4986 | enum { readmax = 4096 }; |
| 4984 | ptrdiff_t count = SPECPDL_INDEX (); | 4987 | ptrdiff_t count = SPECPDL_INDEX (); |
| 4985 | Lisp_Object odeactivate; | 4988 | Lisp_Object odeactivate; |
| 4989 | char chars[sizeof coding->carryover + readmax]; | ||
| 4986 | 4990 | ||
| 4987 | chars = alloca (carryover + readmax); | ||
| 4988 | if (carryover) | 4991 | if (carryover) |
| 4989 | /* See the comment above. */ | 4992 | /* See the comment above. */ |
| 4990 | memcpy (chars, SDATA (p->decoding_buf), carryover); | 4993 | memcpy (chars, SDATA (p->decoding_buf), carryover); |
| @@ -6837,7 +6840,7 @@ add_timer_wait_descriptor (int fd) | |||
| 6837 | { | 6840 | { |
| 6838 | FD_SET (fd, &input_wait_mask); | 6841 | FD_SET (fd, &input_wait_mask); |
| 6839 | FD_SET (fd, &non_keyboard_wait_mask); | 6842 | FD_SET (fd, &non_keyboard_wait_mask); |
| 6840 | FD_SET (fd, &non_process_wait_mask); | 6843 | FD_SET (fd, &non_process_wait_mask); |
| 6841 | fd_callback_info[fd].func = timerfd_callback; | 6844 | fd_callback_info[fd].func = timerfd_callback; |
| 6842 | fd_callback_info[fd].data = NULL; | 6845 | fd_callback_info[fd].data = NULL; |
| 6843 | fd_callback_info[fd].condition |= FOR_READ; | 6846 | fd_callback_info[fd].condition |= FOR_READ; |