Changeset 5582

Show
Ignore:
Timestamp:
01/11/09 13:19:32 (6 years ago)
Author:
khali
Message:

Detect excessive recursion depth during expression evaluation.

Location:
lm-sensors/branches/lm-sensors-3.0.0
Files:
5 modified

Legend:

Unmodified
Added
Removed
  • lm-sensors/branches/lm-sensors-3.0.0/CHANGES

    r5581 r5582  
    66              Add support for current sensors 
    77              Fix error propagation during expression evaluation 
     8              Detect excessive recursion depth during expression evaluation 
    89  maxilife scripts: Delete (driver never ported to Linux 2.6) 
    910  sensord: Accept negative temperatures in RRD database 
  • lm-sensors/branches/lm-sensors-3.0.0/doc/libsensors-API.txt

    r5379 r5582  
    2121  enum sensors_subfeature_type SENSORS_SUBFEATURE_CURR_MAX_ALARM 
    2222  enum sensors_subfeature_type SENSORS_SUBFEATURE_CURR_BEEP 
     23* Added error value for excessive recursion depth 
     24  #define SENSORS_ERR_RECURSION 11 
    2325 
    24260x401   lm-sensors 3.0.2 to 3.0.3 
  • lm-sensors/branches/lm-sensors-3.0.0/lib/access.c

    r5581 r5582  
    22    access.c - Part of libsensors, a Linux library for reading sensor data. 
    33    Copyright (c) 1998, 1999  Frodo Looijaard <frodol@dds.nl> 
    4     Copyright (C) 2007        Jean Delvare <khali@linux-fr.org> 
     4    Copyright (C) 2007, 2008  Jean Delvare <khali@linux-fr.org> 
    55 
    66    This program is free software; you can redistribute it and/or modify 
     
    3030#include "general.h" 
    3131 
     32/* We watch the recursion depth for variables only, as an easy way to 
     33   detect cycles. */ 
     34#define DEPTH_MAX       8 
     35 
    3236static int sensors_eval_expr(const sensors_chip_features *chip_features, 
    3337                             const sensors_expr *expr, 
    34                              double val, double *result); 
     38                             double val, int depth, double *result); 
    3539 
    3640/* Compare two chips name descriptions, to see whether they could match. 
     
    222226   contain wildcard values! This function will return 0 on success, and <0 
    223227   on failure. */ 
    224 int sensors_get_value(const sensors_chip_name *name, int subfeat_nr, 
    225                       double *result) 
     228static int __sensors_get_value(const sensors_chip_name *name, int subfeat_nr, 
     229                               int depth, double *result) 
    226230{ 
    227231        const sensors_chip_features *chip_features; 
     
    231235        int res, i; 
    232236 
     237        if (depth >= DEPTH_MAX) 
     238                return -SENSORS_ERR_RECURSION; 
    233239        if (sensors_chip_name_has_wildcards(name)) 
    234240                return -SENSORS_ERR_WILDCARDS; 
     
    266272        if (!expr) 
    267273                *result = val; 
    268         else if ((res = sensors_eval_expr(chip_features, expr, val, result))) 
     274        else if ((res = sensors_eval_expr(chip_features, expr, val, depth, 
     275                                          result))) 
    269276                return res; 
    270277        return 0; 
     278} 
     279 
     280int sensors_get_value(const sensors_chip_name *name, int subfeat_nr, 
     281                      double *result) 
     282{ 
     283        return __sensors_get_value(name, subfeat_nr, 0, result); 
    271284} 
    272285 
     
    316329        if (expr) 
    317330                if ((res = sensors_eval_expr(chip_features, expr, 
    318                                              value, &to_write))) 
     331                                             value, 0, &to_write))) 
    319332                        return res; 
    320333        return sensors_write_sysfs_attr(name, subfeature, to_write); 
     
    420433int sensors_eval_expr(const sensors_chip_features *chip_features, 
    421434                      const sensors_expr *expr, 
    422                       double val, double *result) 
     435                      double val, int depth, double *result) 
    423436{ 
    424437        double res1, res2; 
     
    438451                                                            expr->data.var))) 
    439452                        return -SENSORS_ERR_NO_ENTRY; 
    440                 return sensors_get_value(&chip_features->chip, 
    441                                          subfeature->number, result); 
     453                return __sensors_get_value(&chip_features->chip, 
     454                                           subfeature->number, depth + 1, 
     455                                           result); 
    442456        } 
    443457        if ((res = sensors_eval_expr(chip_features, expr->data.subexpr.sub1, 
    444                                      val, &res1))) 
     458                                     val, depth, &res1))) 
    445459                return res; 
    446460        if (expr->data.subexpr.sub2 && 
    447461            (res = sensors_eval_expr(chip_features, expr->data.subexpr.sub2, 
    448                                      val, &res2))) 
     462                                     val, depth, &res2))) 
    449463                return res; 
    450464        switch (expr->data.subexpr.op) { 
     
    505519                        res = sensors_eval_expr(chip_features, 
    506520                                                chip->sets[i].value, 0, 
    507                                                 &value); 
     521                                                0, &value); 
    508522                        if (res) { 
    509523                                sensors_parse_error("Error parsing expression", 
  • lm-sensors/branches/lm-sensors-3.0.0/lib/error.c

    r5163 r5582  
    22    error.c - Part of libsensors, a Linux library for reading sensor data. 
    33    Copyright (c) 1998, 1999  Frodo Looijaard <frodol@dds.nl> 
    4     Copyright (C) 2007        Jean Delvare <khali@linux-fr.org> 
     4    Copyright (C) 2007, 2008  Jean Delvare <khali@linux-fr.org> 
    55 
    66    This program is free software; you can redistribute it and/or modify 
     
    4545        /* SENSORS_ERR_ACCESS_W  */ "Can't write", 
    4646        /* SENSORS_ERR_IO        */ "I/O error", 
     47        /* SENSORS_ERR_RECURSION */ "Evaluation recurses too deep", 
    4748}; 
    4849 
  • lm-sensors/branches/lm-sensors-3.0.0/lib/error.h

    r5163 r5582  
    22    error.h - Part of libsensors, a Linux library for reading sensor data. 
    33    Copyright (c) 1998, 1999  Frodo Looijaard <frodol@dds.nl> 
    4     Copyright (C) 2007        Jean Delvare <khali@linux-fr.org> 
     4    Copyright (C) 2007, 2008  Jean Delvare <khali@linux-fr.org> 
    55 
    66    This program is free software; you can redistribute it and/or modify 
     
    3333#define SENSORS_ERR_ACCESS_W    9 /* Can't write */ 
    3434#define SENSORS_ERR_IO          10 /* I/O error */ 
     35#define SENSORS_ERR_RECURSION   11 /* Evaluation recurses too deep */ 
    3536 
    3637#ifdef __cplusplus