diff options
author | Daniel Shahaf <danielsh@apache.org> | 2019-12-17 07:44:26 +0000 |
---|---|---|
committer | Daniel Shahaf <danielsh@apache.org> | 2019-12-18 06:01:47 +0000 |
commit | 3c4b3c87983a989a8404c03639cef1ce5bcd6ef8 (patch) | |
tree | 91a4c0e20e987ed770a91aa23f32c5dd657158c7 /Src | |
parent | 48ebe82b4839fb7a21f021d95e5b76201bad1cb8 (diff) | |
download | zsh-3c4b3c87983a989a8404c03639cef1ce5bcd6ef8.tar.gz zsh-3c4b3c87983a989a8404c03639cef1ce5bcd6ef8.tar.xz zsh-3c4b3c87983a989a8404c03639cef1ce5bcd6ef8.zip |
45064: Fix the mktemp() warning, in debug builds only.
On Linux, linking to mktemp() generates the following warning: . utils.o: In function `gettempname': ./Src/utils.c:2229: warning: the use of `mktemp' is dangerous, better use `mkstemp' or `mkdtemp' The warning cannot be disabled. Work around that by using mkstemp() instead, and massage its output so it behaves like mktemp(). See the new comment for further details.
Diffstat (limited to 'Src')
-rw-r--r-- | Src/utils.c | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/Src/utils.c b/Src/utils.c index 1d916e71f..086c0dfcb 100644 --- a/Src/utils.c +++ b/Src/utils.c @@ -2201,6 +2201,31 @@ gettempname(const char *prefix, int use_heap) #ifdef HAVE__MKTEMP /* Zsh uses mktemp() safely, so silence the warnings */ ret = (char *) _mktemp(ret); +#elif HAVE_MKSTEMP && defined(DEBUG) + { + /* zsh uses mktemp() safely (all callers use O_EXCL, and one of them + * uses mkfifo()/mknod(), as opposed to open()), but some compilers + * warn about this anyway and give no way to disable the warning. To + * appease them, use mkstemp() and then close the fd and unlink the + * filename, to match callers' expectations. + * + * But do this in debug builds only, because we don't want to suffer + * x3 the disk access (touch, unlink, touch again) in production. + */ + int fd; + errno = 0; + fd = mkstemp(ret); + if (fd < 0) + zwarn("can't get a temporary filename: %e", errno); + else { + close(fd); + ret = ztrdup(ret); + + errno = 0; + if (unlink(ret) < 0) + zwarn("unlinking a temporary filename failed: %e", errno); + } + } #else ret = (char *) mktemp(ret); #endif |