summaryrefslogtreecommitdiff
path: root/src/fileio.c
diff options
context:
space:
mode:
authorPaul Eggert <eggert@cs.ucla.edu>2017-08-12 20:04:43 -0700
committerPaul Eggert <eggert@cs.ucla.edu>2017-08-12 20:05:23 -0700
commitebf53ed4f6469d24c3a76835eab014d82aed551c (patch)
tree6a5f10abdc9c59f02910cde7e5f4e479d4835d1d /src/fileio.c
parenta6ad98ad66e1d0c0dac5f25ba91e11d0cf9da725 (diff)
downloademacs-ebf53ed4f6469d24c3a76835eab014d82aed551c.tar.gz
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/fileio.c')
-rw-r--r--src/fileio.c9
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,
Return the name of the generated file. If DIR-FLAG is zero, do not
create the file, just its name. Otherwise, if DIR-FLAG is non-nil,
create an empty directory. The file name should end in SUFFIX.
+Do not expand PREFIX; a non-absolute PREFIX is relative to the Emacs
+working directory.
Signal an error if the file could not be created.
This function does not grok magic file names. */)
(Lisp_Object prefix, Lisp_Object dir_flag, Lisp_Object suffix)
{
- bool make_temp_name = EQ (dir_flag, make_number (0));
+ CHECK_STRING (prefix);
CHECK_STRING (suffix);
- if (!make_temp_name)
- prefix = Fexpand_file_name (prefix, Vtemporary_file_directory);
-
Lisp_Object encoded_prefix = ENCODE_FILE (prefix);
Lisp_Object encoded_suffix = ENCODE_FILE (suffix);
ptrdiff_t prefix_len = SBYTES (encoded_prefix);
@@ -686,7 +685,7 @@ This function does not grok magic file names. */)
memset (data + prefix_len, 'X', nX);
memcpy (data + prefix_len + nX, SSDATA (encoded_suffix), suffix_len);
int kind = (NILP (dir_flag) ? GT_FILE
- : make_temp_name ? GT_NOCREATE
+ : EQ (dir_flag, make_number (0)) ? GT_NOCREATE
: GT_DIR);
int fd = gen_tempname (data, suffix_len, O_BINARY | O_CLOEXEC, kind);
if (fd < 0 || (NILP (dir_flag) && emacs_close (fd) != 0))