diff options
| author | Paul Eggert | 2013-07-11 19:03:47 -0700 |
|---|---|---|
| committer | Paul Eggert | 2013-07-11 19:03:47 -0700 |
| commit | bacba3c26522ef297662bace31947d3e4f47c87a (patch) | |
| tree | 7937ff9ad18bca16aff3ecf1f791632a8dec2ce3 /src/process.c | |
| parent | 1048af7c8ff6e8a84f802fbe655b95c261a6afc0 (diff) | |
| download | emacs-bacba3c26522ef297662bace31947d3e4f47c87a.tar.gz emacs-bacba3c26522ef297662bace31947d3e4f47c87a.zip | |
Fix races with threads and file descriptors.
* configure.ac (PTY_TTY_NAME_SPRINTF): Use emacs_close, not close.
* src/callproc.c (Fcall_process_region):
* src/dired.c (open_directory):
* src/emacs.c (main, Fdaemon_initialized):
* src/image.c (x_find_image_file):
* src/inotify.c (Finotify_rm_watch):
* src/lread.c (Flocate_file_internal):
* src/process.c (Fnetwork_interface_list, Fnetwork_interface_info):
* src/term.c (term_mouse_moveto, init_tty):
* src/termcap.c (tgetent):
* src/unexaix.c, src/unexcoff.c (report_error, report_error_1, adjust_lnnoptrs)
* src/unexaix.c, src/unexcoff.c, src/unexcw.c, src/unexelf.c (unexec):
* src/unexhp9k800.c, src/unexmacosx.c (unexec):
* src/callproc.c (Fcall_process_region):
Use emacs_close, not close.
* src/sysdep.c (POSIX_CLOSE_RESTART, posix_close) [!POSIX_CLOSE_RESTART]:
New macro and function, which emulates the POSIX_CLOSE_RESTART macro
and posix_close function on current platforms (which all lack them).
(emacs_close): Use it. This should fix the races on GNU/Linux and
on AIX and on future platforms that support POSIX_CLOSE_RESTART,
and it should avoid closing random victim file descriptors on
other platforms.
Diffstat (limited to 'src/process.c')
| -rw-r--r-- | src/process.c | 6 |
1 files changed, 3 insertions, 3 deletions
diff --git a/src/process.c b/src/process.c index 36ca1cf6784..bdab1f8cb8a 100644 --- a/src/process.c +++ b/src/process.c | |||
| @@ -3555,14 +3555,14 @@ format; see the description of ADDRESS in `make-network-process'. */) | |||
| 3555 | ifconf.ifc_len = buf_size; | 3555 | ifconf.ifc_len = buf_size; |
| 3556 | if (ioctl (s, SIOCGIFCONF, &ifconf)) | 3556 | if (ioctl (s, SIOCGIFCONF, &ifconf)) |
| 3557 | { | 3557 | { |
| 3558 | close (s); | 3558 | emacs_close (s); |
| 3559 | xfree (buf); | 3559 | xfree (buf); |
| 3560 | return Qnil; | 3560 | return Qnil; |
| 3561 | } | 3561 | } |
| 3562 | } | 3562 | } |
| 3563 | while (ifconf.ifc_len == buf_size); | 3563 | while (ifconf.ifc_len == buf_size); |
| 3564 | 3564 | ||
| 3565 | close (s); | 3565 | emacs_close (s); |
| 3566 | 3566 | ||
| 3567 | res = Qnil; | 3567 | res = Qnil; |
| 3568 | ifreq = ifconf.ifc_req; | 3568 | ifreq = ifconf.ifc_req; |
| @@ -3819,7 +3819,7 @@ FLAGS is the current flags of the interface. */) | |||
| 3819 | #endif | 3819 | #endif |
| 3820 | res = Fcons (elt, res); | 3820 | res = Fcons (elt, res); |
| 3821 | 3821 | ||
| 3822 | close (s); | 3822 | emacs_close (s); |
| 3823 | 3823 | ||
| 3824 | return any ? res : Qnil; | 3824 | return any ? res : Qnil; |
| 3825 | } | 3825 | } |