aboutsummaryrefslogtreecommitdiffstats
path: root/src/process.c
diff options
context:
space:
mode:
authorPaul Eggert2013-07-11 19:03:47 -0700
committerPaul Eggert2013-07-11 19:03:47 -0700
commitbacba3c26522ef297662bace31947d3e4f47c87a (patch)
tree7937ff9ad18bca16aff3ecf1f791632a8dec2ce3 /src/process.c
parent1048af7c8ff6e8a84f802fbe655b95c261a6afc0 (diff)
downloademacs-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.c6
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}