On Wed, 19 Dec 2012 18:04:32 +0300
Sergey Senozhatsky <sergey.senozhatsky(a)gmail.com> wrote:
-- get_param_index()/get_result_index() may be called for unknown
parameter, causing new map entry creation via operator[] access. it's
not safe to check returned pair->second value for newly created map
entry, since there is no default ctor for int type. use map::find()
instead.
-- get_parameter_value(char *) now uses get_parameter_value(uint),
which performs parameters overflow detection and prevents illegal
read. this one was affecting power_device_sort(), returning garbage
to compare function.
Signed-off-by: Sergey Senozhatsky <sergey.senozhatsky(a)gmail.com>
---
src/parameters/parameters.cpp | 40
++++++++++++++++++++++++----------------
src/parameters/parameters.h | 2 +- 2 files changed, 25
insertions(+), 17 deletions(-)
diff --git a/src/parameters/parameters.cpp
b/src/parameters/parameters.cpp index 1a89b14..936d789 100644
--- a/src/parameters/parameters.cpp
+++ b/src/parameters/parameters.cpp
@@ -44,11 +44,15 @@ static int maxresindex = 1;
int get_param_index(const char *name)
{
- int index;
- index = param_index[name];
- if (index == 0) {
- index = param_index[name] = ++maxindex;
- }
+ std::map<string, int>::iterator it;
+ int index = 0;
+
+ it = param_index.find(name);
+ if (it == param_index.end()) {
+ param_index[name] = ++maxindex;
+ index = maxindex;
+ } else
+ index = it->second;
if (index == 0)
printf("OH BLA\n");
@@ -57,11 +61,15 @@ int get_param_index(const char *name)
int get_result_index(const char *name)
{
- int index;
- index = result_index[name];
- if (index == 0) {
- index = result_index[name] = ++maxresindex;
- }
+ std::map<string, int>::iterator it;
+ int index = 0;
+
+ it = result_index.find(name);
+ if (it == result_index.end()) {
+ result_index[name] = ++maxresindex;
+ index = maxresindex;
+ } else
+ index = it->second;
return index;
}
@@ -101,16 +109,16 @@ void set_parameter_value(const char *name,
double value, struct parameter_bundle double
get_parameter_value(const char *name, struct parameter_bundle
*the_bundle) { unsigned int index;
-
index = get_param_index(name);
- if (index >= the_bundle->parameters.size()) {
- fprintf(stderr, "BUG: requesting unregistered
parameter %s\n", name);
- }
- return the_bundle->parameters[index];
+ return get_parameter_value(index, the_bundle);
}
-double get_parameter_value(int index, struct parameter_bundle
*the_bundle) +double get_parameter_value(unsigned int index, struct
parameter_bundle *the_bundle) {
+ if (index >= the_bundle->parameters.size()) {
+ fprintf(stderr, "BUG: requesting unregistered
parameter %d\n", index);
+ return 0;
+ }
return the_bundle->parameters[index];
}
diff --git a/src/parameters/parameters.h b/src/parameters/parameters.h
index a8c1154..bd9fee8 100644
--- a/src/parameters/parameters.h
+++ b/src/parameters/parameters.h
@@ -60,7 +60,7 @@ extern int get_result_index(const char *param);
extern void register_parameter(const char *name, double
default_value = 0.00, double weight = 1.0); extern double
get_parameter_value(const char *name, struct parameter_bundle *bundle
= &all_parameters); -extern double get_parameter_value(int index,
struct parameter_bundle *bundle = &all_parameters); +extern double
get_parameter_value(unsigned int index, struct parameter_bundle
*bundle = &all_parameters); extern void set_parameter_value(const
char *name, double value, struct parameter_bundle *bundle =
&all_parameters);
_______________________________________________
PowerTop mailing list
PowerTop(a)lists.01.org
https://lists.01.org/mailman/listinfo/powertop