diff options
-rw-r--r-- | debuginfod/ChangeLog | 6 | ||||
-rw-r--r-- | debuginfod/debuginfod-client.c | 21 |
2 files changed, 20 insertions, 7 deletions
diff --git a/debuginfod/ChangeLog b/debuginfod/ChangeLog index 39f7d731..26c1a076 100644 --- a/debuginfod/ChangeLog +++ b/debuginfod/ChangeLog @@ -1,5 +1,11 @@ 2022-05-09 Mark Wielaard <mark@klomp.org> + * 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 <mark@klomp.org> + * debuginfod.cxx (conninfo): Always provide servname to getnameinfo. 2022-05-09 Mark Wielaard <mark@klomp.org> diff --git a/debuginfod/debuginfod-client.c b/debuginfod/debuginfod-client.c index 89208216..3b2728f1 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; } |