mirror of
https://github.com/zsh-users/zsh
synced 2024-10-14 11:53:24 +00:00
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.
This commit is contained in:
parent
48ebe82b48
commit
3c4b3c8798
|
@ -1,5 +1,8 @@
|
|||
2019-12-18 Daniel Shahaf <danielsh@apache.org>
|
||||
|
||||
* 45064: Src/utils.c: Fix the mktemp() warning, in debug
|
||||
builds only.
|
||||
|
||||
* 45073: Doc/Zsh/contrib.yo: regex-replace docs: Simplify grammar
|
||||
(avoid a double negative, state defaults first).
|
||||
|
||||
|
|
25
Src/utils.c
25
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
|
||||
|
|
Loading…
Reference in a new issue