From: Maxim Gorbachyov Date: Fri, 19 Jul 2019 06:46:42 +0000 (-0700) Subject: uci/file: replace mktemp() with mkstemp() X-Git-Url: http://git.cdn.openwrt.org/?a=commitdiff_plain;h=415f9e48436d29f612348f58f546b3ad8d74ac38;p=project%2Fuci.git 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 Signed-off-by: Rosen Penev --- diff --git a/file.c b/file.c index 9856369..7333e48 100644 --- a/file.c +++ b/file.c @@ -28,6 +28,7 @@ #include #include #include +#include #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);