diff options
author | Jim Meyering <meyering@redhat.com> | 2008-08-13 20:53:12 +0200 |
---|---|---|
committer | Jim Meyering <meyering@redhat.com> | 2008-08-14 14:37:37 +0200 |
commit | 22999697b81acf3e8683c95c310a36926e7af96f (patch) | |
tree | f1ef3a5e94aca978886adde6bc0aa4ce6553c1aa /src | |
parent | 7e0019b168241b4edb79cc454d00dfc3344df8c7 (diff) | |
download | coreutils-22999697b81acf3e8683c95c310a36926e7af96f.tar.xz |
mktemp, sort, tac: don't use undefined after mkstemp failure
When mkstemp fails, the template buffer may have undefined
contents, so we must not print it.
* src/sort.c (create_temp_file): Use temp_dir, not "file"
when diagnosing failed mkstemp, because "file" may be undefined.
* tests/misc/sort-merge: Adjust for new expected output.
Jeph Cowan and Ralf Wildenhues reported the test failure:
http://thread.gmane.org/gmane.comp.gnu.coreutils.bugs/14235/focus=14257
* src/tac.c (copy_to_temp): Don't use template buffer after
failed mkstemp call, since its contents may be undefined.
* tests/misc/tac (pipe-bad-tmpdir): New test for the above.
* src/mktemp.c (main): Save a copy of the template string,
solely for use in case mkstemp fails.
* tests/misc/mktemp (pipe-bad-tmpdir): New test for the above.
Diffstat (limited to 'src')
-rw-r--r-- | src/mktemp.c | 12 | ||||
-rw-r--r-- | src/sort.c | 3 | ||||
-rw-r--r-- | src/tac.c | 3 |
3 files changed, 12 insertions, 6 deletions
diff --git a/src/mktemp.c b/src/mktemp.c index 8a09231f9..d745e6069 100644 --- a/src/mktemp.c +++ b/src/mktemp.c @@ -242,20 +242,24 @@ main (int argc, char **argv) quote (template)); } - dest_name = file_name_concat (dest_dir, template, NULL); + template = file_name_concat (dest_dir, template, NULL); } else { - dest_name = xstrdup (template); + template = xstrdup (template); } + /* Make a copy to be used in case of diagnostic, since failing + mkstemp may leave the buffer in an undefined state. */ + dest_name = xstrdup (template); + if (create_directory) { int err = mkdtemp_len (dest_name, x_count, dry_run); if (err != 0) { error (0, errno, _("failed to create directory via template %s"), - quote (dest_name)); + quote (template)); status = EXIT_FAILURE; } } @@ -265,7 +269,7 @@ main (int argc, char **argv) if (fd < 0 || (!dry_run && close (fd) != 0)) { error (0, errno, _("failed to create file via template %s"), - quote (dest_name)); + quote (template)); status = EXIT_FAILURE; } } diff --git a/src/sort.c b/src/sort.c index b932a51b3..92f400a96 100644 --- a/src/sort.c +++ b/src/sort.c @@ -741,7 +741,8 @@ create_temp_file (int *pfd) errno = saved_errno; if (fd < 0) - die (_("cannot create temporary file"), file); + error (SORT_FAILURE, errno, _("cannot create temporary file in %s"), + quote (temp_dir)); *pfd = fd; return node; @@ -454,7 +454,8 @@ copy_to_temp (FILE **g_tmp, char **g_tempfile, int input_fd, char const *file) fd = mkstemp (template); if (fd < 0) { - error (0, errno, _("cannot create temporary file %s"), quote (tempfile)); + error (0, errno, _("cannot create temporary file in %s"), + quote (tempdir)); return false; } |