diff --git a/CHANGES b/CHANGES index 3cd15592..51dbac75 100644 --- a/CHANGES +++ b/CHANGES @@ -11,6 +11,7 @@ SVN-HEAD Fix memory leak in scanner when using flex 2.5.9 or later Report configuration file read errors Exit the configuration file parser sooner + Free bus statements from the configuration file sooner lm_sensors.init: Support new format of /etc/sysconfig/lm_sensors (#2246) Drop support for kernels 2.4 and earlier lm_sensors.init.suse: Delete (actual SuSE script is much different) diff --git a/lib/init.c b/lib/init.c index 060d045d..71af5aff 100644 --- a/lib/init.c +++ b/lib/init.c @@ -61,18 +61,42 @@ static int sensors_parse(void) return res; } +static void free_bus(sensors_bus *bus) +{ + free(bus->adapter); +} + +static void free_config_busses(void) +{ + int i; + + for (i = 0; i < sensors_config_busses_count; i++) + free_bus(&sensors_config_busses[i]); + free(sensors_config_busses); + sensors_config_busses = NULL; + sensors_config_busses_count = sensors_config_busses_max = 0; +} + static int parse_config(FILE *input) { int err; - if (sensors_scanner_init(input)) - return -SENSORS_ERR_PARSE; + if (sensors_scanner_init(input)) { + err = -SENSORS_ERR_PARSE; + goto exit_cleanup; + } err = sensors_parse(); sensors_scanner_exit(); - if (err) - return -SENSORS_ERR_PARSE; + if (err) { + err = -SENSORS_ERR_PARSE; + goto exit_cleanup; + } - return 0; + err = sensors_substitute_busses(); + +exit_cleanup: + free_config_busses(); + return err; } int sensors_init(FILE *input) @@ -107,8 +131,6 @@ int sensors_init(FILE *input) } } - if ((res = sensors_substitute_busses())) - goto exit_cleanup; return 0; exit_cleanup: @@ -134,11 +156,6 @@ static void free_chip_features(sensors_chip_features *features) free(features->feature); } -static void free_bus(sensors_bus *bus) -{ - free(bus->adapter); -} - static void free_label(sensors_label *label) { free(label->name); @@ -218,12 +235,6 @@ void sensors_cleanup(void) sensors_proc_chips = NULL; sensors_proc_chips_count = sensors_proc_chips_max = 0; - for (i = 0; i < sensors_config_busses_count; i++) - free_bus(&sensors_config_busses[i]); - free(sensors_config_busses); - sensors_config_busses = NULL; - sensors_config_busses_count = sensors_config_busses_max = 0; - for (i = 0; i < sensors_config_chips_count; i++) free_chip(&sensors_config_chips[i]); free(sensors_config_chips);