mirror of
https://github.com/lm-sensors/lm-sensors.git
synced 2026-11-09 16:21:51 +00:00
Store the feature list length separately instead of null-terminating
the list. This make it possible to check for out-of-bound indexes without walking the entire list, so that direct look-ups are safer. git-svn-id: http://lm-sensors.org/svn/lm-sensors/branches/lm-sensors-3.0.0@4760 7894878c-1315-0410-8ee3-d5d059ff63e0
This commit is contained in:
1 parent
7975800ac1
commit
23f4274010
4 files changed
+15
-10
No files matched your search
+6
-3
@@ -96,6 +96,9 @@ const sensors_chip_feature *sensors_lookup_feature_nr(const sensors_chip_name *c
|
||||
|
||||
for (i = 0; i < sensors_proc_chips_count; i++)
|
||||
if (sensors_match_chip(&sensors_proc_chips[i].chip, chip)) {
|
||||
if (feature < 0 ||
|
||||
feature >= sensors_proc_chips[i].feature_count)
|
||||
return NULL;
|
||||
return sensors_proc_chips[i].feature + feature;
|
||||
}
|
||||
return NULL;
|
||||
@@ -113,7 +116,7 @@ sensors_lookup_feature_name(const sensors_chip_name *chip, const char *feature)
|
||||
for (i = 0; i < sensors_proc_chips_count; i++)
|
||||
if (sensors_match_chip(&sensors_proc_chips[i].chip, chip)) {
|
||||
features = sensors_proc_chips[i].feature;
|
||||
for (j = 0; features[j].data.name; j++)
|
||||
for (j = 0; j < sensors_proc_chips[i].feature_count; j++)
|
||||
if (!strcasecmp(features[j].data.name, feature))
|
||||
return features + j;
|
||||
}
|
||||
@@ -350,10 +353,10 @@ const sensors_feature_data *sensors_get_all_features(const sensors_chip_name *na
|
||||
for (i = 0; i < sensors_proc_chips_count; i++)
|
||||
if (sensors_match_chip(&sensors_proc_chips[i].chip, name)) {
|
||||
feature_list = sensors_proc_chips[i].feature;
|
||||
while (feature_list[*nr].data.name
|
||||
while (*nr < sensors_proc_chips[i].feature_count
|
||||
&& sensors_get_ignored(name, &feature_list[*nr]))
|
||||
(*nr)++;
|
||||
if (!feature_list[*nr].data.name)
|
||||
if (*nr == sensors_proc_chips[i].feature_count)
|
||||
return NULL;
|
||||
return &feature_list[(*nr)++].data;
|
||||
}
|
||||
|
||||
@@ -143,6 +143,7 @@ typedef struct sensors_chip_feature {
|
||||
typedef struct sensors_chip_features {
|
||||
struct sensors_chip_name chip;
|
||||
struct sensors_chip_feature *feature;
|
||||
int feature_count;
|
||||
} sensors_chip_features;
|
||||
|
||||
extern sensors_chip *sensors_config_chips;
|
||||
|
||||
+5
-5
@@ -51,13 +51,13 @@ static void free_chip_name(sensors_chip_name *name)
|
||||
free(name->path);
|
||||
}
|
||||
|
||||
static void free_chip_features(sensors_chip_feature *features)
|
||||
static void free_chip_features(sensors_chip_features *features)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; features[i].data.name; i++)
|
||||
free(features[i].data.name);
|
||||
free(features);
|
||||
for (i = 0; i < features->feature_count; i++)
|
||||
free(features->feature[i].data.name);
|
||||
free(features->feature);
|
||||
}
|
||||
|
||||
static void free_bus(sensors_bus *bus)
|
||||
@@ -140,7 +140,7 @@ void sensors_cleanup(void)
|
||||
|
||||
for (i = 0; i < sensors_proc_chips_count; i++) {
|
||||
free_chip_name(&sensors_proc_chips[i].chip);
|
||||
free_chip_features(sensors_proc_chips[i].feature);
|
||||
free_chip_features(&sensors_proc_chips[i]);
|
||||
}
|
||||
free(sensors_proc_chips);
|
||||
sensors_proc_chips = NULL;
|
||||
|
||||
+3
-2
@@ -64,7 +64,7 @@ int get_type_scaling(int type)
|
||||
static int sensors_read_dynamic_chip(sensors_chip_features *chip,
|
||||
struct sysfs_device *sysdir)
|
||||
{
|
||||
int i, type, fnum = 1;
|
||||
int i, type, fnum = 0;
|
||||
struct sysfs_attribute *attr;
|
||||
struct dlist *attrs;
|
||||
sensors_chip_feature *features;
|
||||
@@ -160,7 +160,7 @@ static int sensors_read_dynamic_chip(sensors_chip_features *chip,
|
||||
fnum++;
|
||||
}
|
||||
|
||||
if (fnum == 1) { /* No feature */
|
||||
if (!fnum) { /* No feature */
|
||||
chip->feature = NULL;
|
||||
goto exit_free;
|
||||
}
|
||||
@@ -194,6 +194,7 @@ static int sensors_read_dynamic_chip(sensors_chip_features *chip,
|
||||
}
|
||||
|
||||
chip->feature = dyn_features;
|
||||
chip->feature_count = fnum;
|
||||
|
||||
exit_free:
|
||||
free(features);
|
||||
|
||||
Reference in new issue
Block a user