From abe8ecb3d34af261d1dcdd5dff5acd7ef4efe38a Mon Sep 17 00:00:00 2001 From: Joachim Wiberg Date: Sun, 16 Apr 2023 14:37:41 +0200 Subject: [PATCH] src/confd: fix invalid use of fopenf() in write*f() wrappers Signed-off-by: Joachim Wiberg --- src/confd/src/helpers.c | 47 +++++++++++++++++++++++++++++------------ 1 file changed, 33 insertions(+), 14 deletions(-) diff --git a/src/confd/src/helpers.c b/src/confd/src/helpers.c index 1338c731..d61488b1 100644 --- a/src/confd/src/helpers.c +++ b/src/confd/src/helpers.c @@ -3,24 +3,45 @@ #include #include "core.h" +static FILE *open_file(const char *mode, const char *fmt, va_list ap) +{ + va_list apc; + char *file; + int len; + + va_copy(apc, ap); + len = vsnprintf(NULL, 0, fmt, apc); + va_end(apc); + + file = alloca(len + 1); + if (!file) { + errno = ENOMEM; + return NULL; + } + + va_copy(apc, ap); + vsnprintf(file, len + 1, fmt, apc); + va_end(apc); + + return fopen(file, mode); +} + /* * Write interger value to a file composed from fmt and optional args. */ int writedf(int value, const char *fmt, ...) { va_list ap; - int rc = -1; FILE *fp; va_start(ap, fmt); - fp = fopenf("w", fmt, ap); - if (fp) { - fprintf(fp, "%d\n", value); - rc = fclose(fp); - } + fp = open_file("r+", fmt, ap); va_end(ap); + if (!fp) + return -1; - return rc; + fprintf(fp, "%d\n", value); + return fclose(fp); } /* @@ -29,17 +50,15 @@ int writedf(int value, const char *fmt, ...) int writesf(const char *str, const char *fmt, ...) { va_list ap; - int rc = -1; FILE *fp; va_start(ap, fmt); - fp = fopenf("w", fmt, ap); - if (fp) { - fprintf(fp, "%s\n", str); - rc = fclose(fp); - } + fp = open_file("r+", fmt, ap); va_end(ap); + if (!fp) + return -1; - return rc; + fprintf(fp, "%s\n", str); + return fclose(fp); }