From 521f1343e372e011326e10cf58a9ba1d191b7bdb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20G=C3=B6ttsche?= Date: Fri, 12 Mar 2021 16:56:06 +0100 Subject: [PATCH] Settings: check if writing configuration file was successful Writing to the file stream might fail due to a immutable file or a filesystem error. Check the error indicator for the stream and for fclose() failures. --- Settings.c | 13 ++++++++----- Settings.h | 2 +- htop.c | 9 +++++++-- 3 files changed, 16 insertions(+), 8 deletions(-) diff --git a/Settings.c b/Settings.c index ab1927de..62fadf07 100644 --- a/Settings.c +++ b/Settings.c @@ -7,6 +7,7 @@ in the source distribution for its full text. #include "Settings.h" +#include #include #include #include @@ -280,10 +281,10 @@ static void writeMeterModes(const Settings* this, FILE* fd, int column) { fprintf(fd, "\n"); } -bool Settings_write(const Settings* this) { +int Settings_write(const Settings* this) { FILE* fd = fopen(this->filename, "w"); if (fd == NULL) - return false; + return -errno; fprintf(fd, "# Beware! This file is rewritten by htop when settings are changed in the interface.\n"); fprintf(fd, "# The parser is also very primitive, and not human-friendly.\n"); @@ -331,8 +332,10 @@ bool Settings_write(const Settings* this) { #ifdef HAVE_LIBHWLOC fprintf(fd, "topology_affinity=%d\n", (int) this->topologyAffinity); #endif - fclose(fd); - return true; + + int r1 = ferror(fd); + int r2 = fclose(fd); + return r1 ? r1 : r2; } Settings* Settings_new(int initialCpuCount) { @@ -422,7 +425,7 @@ Settings* Settings_new(int initialCpuCount) { ok = Settings_read(this, legacyDotfile, initialCpuCount); if (ok) { // Transition to new location and delete old configuration file - if (Settings_write(this)) { + if (Settings_write(this) == 0) { unlink(legacyDotfile); } } diff --git a/Settings.h b/Settings.h index c18173b4..471792bd 100644 --- a/Settings.h +++ b/Settings.h @@ -87,7 +87,7 @@ static inline int Settings_getActiveDirection(const Settings* this) { void Settings_delete(Settings* this); -bool Settings_write(const Settings* this); +int Settings_write(const Settings* this); Settings* Settings_new(int initialCpuCount); diff --git a/htop.c b/htop.c index 785d4554..285353d5 100644 --- a/htop.c +++ b/htop.c @@ -482,8 +482,13 @@ int main(int argc, char** argv) { Platform_done(); CRT_done(); - if (settings->changed) - Settings_write(settings); + + if (settings->changed) { + int r = Settings_write(settings); + if (r < 0) + fprintf(stderr, "Can not save configuration to %s: %s\n", settings->filename, strerror(-r)); + } + Header_delete(header); ProcessList_delete(pl);