diff options
| author | Paul Eggert <eggert@cs.ucla.edu> | 2014-04-12 14:54:27 -0700 |
|---|---|---|
| committer | Paul Eggert <eggert@cs.ucla.edu> | 2014-04-12 14:54:27 -0700 |
| commit | a9108bf189e6cccfe568348ec604b9eecd17a125 (patch) | |
| tree | 9ea864fe8764d383a6a6a74719d15fb049415efc | |
| parent | 175a3a5144ab17bc8c854cd0cc6c1771d79a9f9c (diff) | |
| download | emacs-a9108bf189e6cccfe568348ec604b9eecd17a125.tar.gz | |
* keyboard.c (Fopen_dribble_file): Avoid some races.
Fixes: debbugs:17187
| -rw-r--r-- | src/ChangeLog | 4 | ||||
| -rw-r--r-- | src/keyboard.c | 12 |
2 files changed, 7 insertions, 9 deletions
diff --git a/src/ChangeLog b/src/ChangeLog index cb17738d139..2d7307412b2 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,7 @@ +2014-04-12 Paul Eggert <eggert@cs.ucla.edu> + + * keyboard.c (Fopen_dribble_file): Avoid some races. (Bug#17187) + 2014-04-12 Eli Zaretskii <eliz@gnu.org> * xdisp.c (move_it_by_lines): If a large portion of buffer text is diff --git a/src/keyboard.c b/src/keyboard.c index f74ba0ee581..a66054f153f 100644 --- a/src/keyboard.c +++ b/src/keyboard.c @@ -10088,15 +10088,9 @@ This may include sensitive information such as passwords. */) { int fd; file = Fexpand_file_name (file, Qnil); - /* This isn't robust, since eg file could be created after we - check whether it exists but before emacs_open. - Feel free to improve it, but this is not critical. (Bug#17187) */ - if (! NILP (Ffile_exists_p (file))) - { - if (chmod (SSDATA (file), 0600) < 0) - report_file_error ("Doing chmod", file); - } - fd = emacs_open (SSDATA (file), O_WRONLY | O_CREAT | O_TRUNC, 0600); + fd = emacs_open (SSDATA (file), O_WRONLY | O_CREAT | O_EXCL, 0600); + if (fd < 0 && errno == EEXIST && unlink (SSDATA (file)) == 0) + fd = emacs_open (SSDATA (file), O_WRONLY | O_CREAT | O_EXCL, 0600); dribble = fd < 0 ? 0 : fdopen (fd, "w"); if (dribble == 0) report_file_error ("Opening dribble", file); |
