From: Mark Wielaard Date: Sun, 8 May 2022 21:55:19 +0000 (+0200) Subject: debuginfod: Make sure debuginfod_config_cache always returns valid stat X-Git-Tag: elfutils-0.188~69 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=a6b3e9dd4e725e1500872f3726f97954b81d59ad;p=thirdparty%2Felfutils.git debuginfod: Make sure debuginfod_config_cache always returns valid stat If the condig file which value was requested from debuginfod_config_cache didn't exist yet, stat would fail and no valid struct stat would be returned even when the file was correctly created. Fix this by always using O_CREAT to open the file, and reuse that file descriptor to call fstat and for either writing the default value or reading the config file value. Signed-off-by: Mark Wielaard --- diff --git a/debuginfod/ChangeLog b/debuginfod/ChangeLog index 39f7d731a..26c1a076b 100644 --- a/debuginfod/ChangeLog +++ b/debuginfod/ChangeLog @@ -1,3 +1,9 @@ +2022-05-09 Mark Wielaard + + * debuginfod-client.c (debuginfod_config_cache): Always open with + O_CREATE first, then use fstat, only write the cache_config_default_s + value if st_size == 0, otherwise read value from file. + 2022-05-09 Mark Wielaard * debuginfod.cxx (conninfo): Always provide servname to getnameinfo. diff --git a/debuginfod/debuginfod-client.c b/debuginfod/debuginfod-client.c index 892082163..3b2728f12 100644 --- a/debuginfod/debuginfod-client.c +++ b/debuginfod/debuginfod-client.c @@ -235,14 +235,19 @@ debuginfod_config_cache(char *config_path, long cache_config_default_s, struct stat *st) { - int fd; - /* if the config file doesn't exist, create one with DEFFILEMODE*/ - if(stat(config_path, st) == -1) + int fd = open(config_path, O_CREAT | O_RDWR, DEFFILEMODE); + if (fd < 0) + return -errno; + + if (fstat (fd, st) < 0) { - fd = open(config_path, O_CREAT | O_RDWR, DEFFILEMODE); - if (fd < 0) - return -errno; + int ret = -errno; + close (fd); + return ret; + } + if (st->st_size == 0) + { if (dprintf(fd, "%ld", cache_config_default_s) < 0) { int ret = -errno; @@ -251,10 +256,11 @@ debuginfod_config_cache(char *config_path, } close (fd); + return cache_config_default_s; } long cache_config; - FILE *config_file = fopen(config_path, "r"); + FILE *config_file = fdopen(fd, "r"); if (config_file) { if (fscanf(config_file, "%ld", &cache_config) != 1) @@ -264,6 +270,7 @@ debuginfod_config_cache(char *config_path, else cache_config = cache_config_default_s; + close (fd); return cache_config; }