From 8aa001900fe38277e2da06e9d1dce93d985838ba Mon Sep 17 00:00:00 2001 From: Jean Delvare Date: Tue, 6 Mar 2012 07:22:06 +0000 Subject: [PATCH] Fix memory leaks in sensord revealed by valgrind. The leak in daemonize() is harmless, we're about to exit anyway. Fix it still to make valgrind happy. The leak in do_features() is real, as the function is called periodically by the daemon, for all actions. If the intervals at set low and the system has many sensors, the leak could be significant, maybe 150 kB/day. git-svn-id: http://lm-sensors.org/svn/lm-sensors/trunk@6025 7894878c-1315-0410-8ee3-d5d059ff63e0 --- CHANGES | 1 + prog/sensord/sense.c | 22 +++++++++++++--------- prog/sensord/sensord.c | 6 +++++- 3 files changed, 19 insertions(+), 10 deletions(-) diff --git a/CHANGES b/CHANGES index 8981e693..b25a67fb 100644 --- a/CHANGES +++ b/CHANGES @@ -4,6 +4,7 @@ lm-sensors CHANGES file SVN HEAD libsensors: Added support for new sysfs attributes Change sysfs detection to survive upcoming kernel changes + sensord: Fix memory leaks revealed by valgrind sensors: Added support for new sysfs attributes Display both instantaneous and average power if available. Report thermal sensor type 1 as CPU diode diff --git a/prog/sensord/sense.c b/prog/sensord/sense.c index ed9b13b0..f3765320 100644 --- a/prog/sensord/sense.c +++ b/prog/sensord/sense.c @@ -132,14 +132,7 @@ static int do_features(const sensors_chip_name *chip, const FeatureDescriptor *feature, int action) { char *label; - int alrm, beep; - - label = sensors_get_label(chip, feature->feature); - if (!label) { - sensorLog(LOG_ERR, "Error getting sensor label: %s/%s", - chip->prefix, feature->feature->name); - return -1; - } + int alrm, beep, ret; alrm = get_flag(chip, feature->alarmNumber); if (alrm == -1) @@ -151,7 +144,18 @@ static int do_features(const sensors_chip_name *chip, if (beep == -1) return -1; - return get_features(chip, feature, action, label, alrm, beep); + label = sensors_get_label(chip, feature->feature); + if (!label) { + sensorLog(LOG_ERR, "Error getting sensor label: %s/%s", + chip->prefix, feature->feature->name); + return -1; + } + + ret = get_features(chip, feature, action, label, alrm, beep); + + free(label); + + return ret; } static int doKnownChip(const sensors_chip_name *chip, diff --git a/prog/sensord/sensord.c b/prog/sensord/sensord.c index 8b75cad8..a3f0ec0e 100644 --- a/prog/sensord/sensord.c +++ b/prog/sensord/sensord.c @@ -204,7 +204,11 @@ static void daemonize(void) } else if (pid != 0) { fprintf(file, "%d\n", pid); fclose(file); - unloadLib(); + + freeChips(); + if (unloadLib()) + exit(EXIT_FAILURE); + exit(EXIT_SUCCESS); }