diff options
| author | Maxim Gorbachyov | 2019-07-19 06:46:42 +0000 |
|---|---|---|
| committer | Hauke Mehrtens | 2019-09-01 10:45:54 +0000 |
| commit | 415f9e48436d29f612348f58f546b3ad8d74ac38 (patch) | |
| tree | ab248822b4795b9b1c4a69af37268a094c3fbca0 | |
| parent | f199b961c2970b63cc83947ad49b327b3f48f05f (diff) | |
| download | uci-415f9e48436d29f612348f58f546b3ad8d74ac38.tar.gz | |
uci/file: replace mktemp() with mkstemp()
mktemp is unsafe to use as well as deprecated by POSIX.1-2008. uClibc-ng
optionally does not include it when SuSv3 legacy functions are disabled.
Signed-off-by: Maxim Gorbachyov <maxim.gorbachyov@gmail.com>
Signed-off-by: Rosen Penev <rosenp@gmail.com>
| -rw-r--r-- | file.c | 19 |
1 files changed, 11 insertions, 8 deletions
@@ -28,6 +28,7 @@ #include <glob.h> #include <string.h> #include <stdlib.h> +#include <errno.h> #include "uci.h" #include "uci_internal.h" @@ -723,8 +724,8 @@ static void uci_file_commit(struct uci_context *ctx, struct uci_package **packag char *name = NULL; char *path = NULL; char *filename = NULL; - struct stat statbuf; bool do_rename = false; + int fd; if (!p->path) { if (overwrite) @@ -770,18 +771,20 @@ static void uci_file_commit(struct uci_context *ctx, struct uci_package **packag goto done; } - if (!mktemp(filename)) - *filename = 0; + fd = mkstemp(filename); + if (fd == -1) + UCI_THROW(ctx, UCI_ERR_IO); - if (!*filename) { - free(filename); + if ((flock(fd, LOCK_EX) < 0) && (errno != ENOSYS)) + UCI_THROW(ctx, UCI_ERR_IO); + + if (lseek(fd, 0, SEEK_SET) < 0) UCI_THROW(ctx, UCI_ERR_IO); - } - if ((stat(filename, &statbuf) == 0) && ((statbuf.st_mode & S_IFMT) != S_IFREG)) + f2 = fdopen(fd, "w+"); + if (!f2) UCI_THROW(ctx, UCI_ERR_IO); - f2 = uci_open_stream(ctx, filename, p->path, SEEK_SET, true, true); uci_export(ctx, f2, p, false); fflush(f2); |