diff options
| author | Paul Eggert | 2017-08-12 20:04:43 -0700 |
|---|---|---|
| committer | Paul Eggert | 2017-08-12 20:05:23 -0700 |
| commit | ebf53ed4f6469d24c3a76835eab014d82aed551c (patch) | |
| tree | 6a5f10abdc9c59f02910cde7e5f4e479d4835d1d /src | |
| parent | a6ad98ad66e1d0c0dac5f25ba91e11d0cf9da725 (diff) | |
| download | emacs-ebf53ed4f6469d24c3a76835eab014d82aed551c.tar.gz emacs-ebf53ed4f6469d24c3a76835eab014d82aed551c.zip | |
Fix make-temp-file bug with ""/"."/".." prefix
The bug with "." and ".." has been present for a while; I
introduced the bug with "" earlier today in my patch for Bug#28023.
* lisp/files.el (make-temp-file): Do not use expand-file-name if
PREFIX is empty or "." or "..", as it does the wrong thing.
Compute absolute-prefix here ...
(files--make-magic-temp-file): ... instead of here ...
* src/fileio.c (Fmake_temp_file_internal): ... or here.
* lisp/files.el (make-temp-file): If the prefix is empty, append
"/" to the absolute prefix so that the new files are children
rather than siblings of temporary-file-directory. This fixes a
bug introduced in the previous change.
* test/lisp/files-tests.el (files-test-make-temp-file-empty-prefix):
New test, for the bug.
Diffstat (limited to 'src')
| -rw-r--r-- | src/fileio.c | 9 |
1 files changed, 4 insertions, 5 deletions
diff --git a/src/fileio.c b/src/fileio.c index b7e3b71a475..69079c6ae49 100644 --- a/src/fileio.c +++ b/src/fileio.c | |||
| @@ -662,17 +662,16 @@ DEFUN ("make-temp-file-internal", Fmake_temp_file_internal, | |||
| 662 | Return the name of the generated file. If DIR-FLAG is zero, do not | 662 | Return the name of the generated file. If DIR-FLAG is zero, do not |
| 663 | create the file, just its name. Otherwise, if DIR-FLAG is non-nil, | 663 | create the file, just its name. Otherwise, if DIR-FLAG is non-nil, |
| 664 | create an empty directory. The file name should end in SUFFIX. | 664 | create an empty directory. The file name should end in SUFFIX. |
| 665 | Do not expand PREFIX; a non-absolute PREFIX is relative to the Emacs | ||
| 666 | working directory. | ||
| 665 | 667 | ||
| 666 | Signal an error if the file could not be created. | 668 | Signal an error if the file could not be created. |
| 667 | 669 | ||
| 668 | This function does not grok magic file names. */) | 670 | This function does not grok magic file names. */) |
| 669 | (Lisp_Object prefix, Lisp_Object dir_flag, Lisp_Object suffix) | 671 | (Lisp_Object prefix, Lisp_Object dir_flag, Lisp_Object suffix) |
| 670 | { | 672 | { |
| 671 | bool make_temp_name = EQ (dir_flag, make_number (0)); | 673 | CHECK_STRING (prefix); |
| 672 | CHECK_STRING (suffix); | 674 | CHECK_STRING (suffix); |
| 673 | if (!make_temp_name) | ||
| 674 | prefix = Fexpand_file_name (prefix, Vtemporary_file_directory); | ||
| 675 | |||
| 676 | Lisp_Object encoded_prefix = ENCODE_FILE (prefix); | 675 | Lisp_Object encoded_prefix = ENCODE_FILE (prefix); |
| 677 | Lisp_Object encoded_suffix = ENCODE_FILE (suffix); | 676 | Lisp_Object encoded_suffix = ENCODE_FILE (suffix); |
| 678 | ptrdiff_t prefix_len = SBYTES (encoded_prefix); | 677 | ptrdiff_t prefix_len = SBYTES (encoded_prefix); |
| @@ -686,7 +685,7 @@ This function does not grok magic file names. */) | |||
| 686 | memset (data + prefix_len, 'X', nX); | 685 | memset (data + prefix_len, 'X', nX); |
| 687 | memcpy (data + prefix_len + nX, SSDATA (encoded_suffix), suffix_len); | 686 | memcpy (data + prefix_len + nX, SSDATA (encoded_suffix), suffix_len); |
| 688 | int kind = (NILP (dir_flag) ? GT_FILE | 687 | int kind = (NILP (dir_flag) ? GT_FILE |
| 689 | : make_temp_name ? GT_NOCREATE | 688 | : EQ (dir_flag, make_number (0)) ? GT_NOCREATE |
| 690 | : GT_DIR); | 689 | : GT_DIR); |
| 691 | int fd = gen_tempname (data, suffix_len, O_BINARY | O_CLOEXEC, kind); | 690 | int fd = gen_tempname (data, suffix_len, O_BINARY | O_CLOEXEC, kind); |
| 692 | if (fd < 0 || (NILP (dir_flag) && emacs_close (fd) != 0)) | 691 | if (fd < 0 || (NILP (dir_flag) && emacs_close (fd) != 0)) |