Changeset 4760

Show
Ignore:
Timestamp:
09/05/07 10:19:42 (7 years ago)
Author:
khali
Message:

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.

Location:
lm-sensors/branches/lm-sensors-3.0.0/lib
Files:
4 modified

Legend:

Unmodified
Added
Removed
  • lm-sensors/branches/lm-sensors-3.0.0/lib/access.c

    r4759 r4760  
    9797        for (i = 0; i < sensors_proc_chips_count; i++) 
    9898                if (sensors_match_chip(&sensors_proc_chips[i].chip, chip)) { 
     99                        if (feature < 0 || 
     100                            feature >= sensors_proc_chips[i].feature_count) 
     101                                return NULL; 
    99102                        return sensors_proc_chips[i].feature + feature; 
    100103                } 
     
    114117                if (sensors_match_chip(&sensors_proc_chips[i].chip, chip)) { 
    115118                        features = sensors_proc_chips[i].feature; 
    116                         for (j = 0; features[j].data.name; j++) 
     119                        for (j = 0; j < sensors_proc_chips[i].feature_count; j++) 
    117120                                if (!strcasecmp(features[j].data.name, feature)) 
    118121                                        return features + j; 
     
    351354                if (sensors_match_chip(&sensors_proc_chips[i].chip, name)) { 
    352355                        feature_list = sensors_proc_chips[i].feature; 
    353                         while (feature_list[*nr].data.name 
     356                        while (*nr < sensors_proc_chips[i].feature_count 
    354357                            && sensors_get_ignored(name, &feature_list[*nr])) 
    355358                                (*nr)++; 
    356                         if (!feature_list[*nr].data.name) 
     359                        if (*nr == sensors_proc_chips[i].feature_count) 
    357360                                return NULL; 
    358361                        return &feature_list[(*nr)++].data; 
  • lm-sensors/branches/lm-sensors-3.0.0/lib/data.h

    r4758 r4760  
    144144        struct sensors_chip_name chip; 
    145145        struct sensors_chip_feature *feature; 
     146        int feature_count; 
    146147} sensors_chip_features; 
    147148 
  • lm-sensors/branches/lm-sensors-3.0.0/lib/init.c

    r4737 r4760  
    5252} 
    5353 
    54 static void free_chip_features(sensors_chip_feature *features) 
     54static void free_chip_features(sensors_chip_features *features) 
    5555{ 
    5656        int i; 
    5757 
    58         for (i = 0; features[i].data.name; i++) 
    59                 free(features[i].data.name); 
    60         free(features); 
     58        for (i = 0; i < features->feature_count; i++) 
     59                free(features->feature[i].data.name); 
     60        free(features->feature); 
    6161} 
    6262 
     
    141141        for (i = 0; i < sensors_proc_chips_count; i++) { 
    142142                free_chip_name(&sensors_proc_chips[i].chip); 
    143                 free_chip_features(sensors_proc_chips[i].feature); 
     143                free_chip_features(&sensors_proc_chips[i]); 
    144144        } 
    145145        free(sensors_proc_chips); 
  • lm-sensors/branches/lm-sensors-3.0.0/lib/sysfs.c

    r4759 r4760  
    6565                                     struct sysfs_device *sysdir) 
    6666{ 
    67         int i, type, fnum = 1; 
     67        int i, type, fnum = 0; 
    6868        struct sysfs_attribute *attr; 
    6969        struct dlist *attrs; 
     
    161161        } 
    162162 
    163         if (fnum == 1) { /* No feature */ 
     163        if (!fnum) { /* No feature */ 
    164164                chip->feature = NULL; 
    165165                goto exit_free; 
     
    195195 
    196196        chip->feature = dyn_features; 
     197        chip->feature_count = fnum; 
    197198 
    198199exit_free: