From ef30e6382ab0a40bbea9360555e73e1e7f27dc6f Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Thu, 18 Jul 2013 01:35:27 -0700 Subject: [PATCH] * term.c: Fix minor fdopen-related file descriptor leaks. * term.c (Fresume_tty) [!MSDOS]: Close fd if fdopen (fd) fails. (init_tty) [!DOS_NT]: Likewise. Also close fd if isatty (fd) fails. --- src/ChangeLog | 4 ++++ src/term.c | 43 +++++++++++++++++++------------------------ 2 files changed, 23 insertions(+), 24 deletions(-) diff --git a/src/ChangeLog b/src/ChangeLog index 3f667a7bcc7..6c9cfaa7412 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,5 +1,9 @@ 2013-07-18 Paul Eggert + * term.c: Fix minor fdopen-related file descriptor leaks. + * term.c (Fresume_tty) [!MSDOS]: Close fd if fdopen (fd) fails. + (init_tty) [!DOS_NT]: Likewise. Also close fd if isatty (fd) fails. + * charset.c: Fix file descriptor leaks and errno issues. Include . (load_charset_map_from_file): Don't leak file descriptor on error. diff --git a/src/term.c b/src/term.c index b6878a0abd1..376d6e7831a 100644 --- a/src/term.c +++ b/src/term.c @@ -2416,15 +2416,20 @@ frame's terminal). */) t->display_info.tty->input = stdin; #else /* !MSDOS */ fd = emacs_open (t->display_info.tty->name, O_RDWR | O_NOCTTY, 0); + t->display_info.tty->input = t->display_info.tty->output + = fd < 0 ? 0 : fdopen (fd, "w+"); - if (fd == -1) - error ("Can not reopen tty device %s: %s", t->display_info.tty->name, strerror (errno)); + if (! t->display_info.tty->input) + { + int open_errno = errno; + emacs_close (fd); + report_file_errno ("Cannot reopen tty device", + build_string (t->display_info.tty->name), + open_errno); + } if (!O_IGNORE_CTTY && strcmp (t->display_info.tty->name, DEV_TTY) != 0) dissociate_if_controlling_tty (fd); - - t->display_info.tty->output = fdopen (fd, "w+"); - t->display_info.tty->input = t->display_info.tty->output; #endif add_keyboard_wait_descriptor (fd); @@ -2990,7 +2995,6 @@ init_tty (const char *name, const char *terminal_type, bool must_succeed) { /* Open the terminal device. */ - FILE *file; /* If !ctty, don't recognize it as our controlling terminal, and don't make it the controlling tty if we don't have one now. @@ -3001,30 +3005,21 @@ init_tty (const char *name, const char *terminal_type, bool must_succeed) open a frame on the same terminal. */ int flags = O_RDWR | O_NOCTTY | (ctty ? 0 : O_IGNORE_CTTY); int fd = emacs_open (name, flags, 0); + tty->input = tty->output = fd < 0 || ! isatty (fd) ? 0 : fdopen (fd, "w+"); - tty->name = xstrdup (name); - terminal->name = xstrdup (name); - - if (fd < 0) - maybe_fatal (must_succeed, terminal, - "Could not open file: %s", - "Could not open file: %s", - name); - if (!isatty (fd)) + if (! tty->input) { - emacs_close (fd); - maybe_fatal (must_succeed, terminal, - "Not a tty device: %s", - "Not a tty device: %s", - name); + char const *diagnostic + = tty->input ? "Not a tty device: %s" : "Could not open file: %s"; + emacs_close (fd); + maybe_fatal (must_succeed, terminal, diagnostic, diagnostic, name); } + tty->name = xstrdup (name); + terminal->name = xstrdup (name); + if (!O_IGNORE_CTTY && !ctty) dissociate_if_controlling_tty (fd); - - file = fdopen (fd, "w+"); - tty->input = file; - tty->output = file; } tty->type = xstrdup (terminal_type); -- 2.11.4.GIT