diff --git a/src/modules/systemlib/param/param.c b/src/modules/systemlib/param/param.c index 47c3814edd..84e91c32d0 100644 --- a/src/modules/systemlib/param/param.c +++ b/src/modules/systemlib/param/param.c @@ -47,7 +47,6 @@ #include #include #include -#include #include #include #include @@ -116,7 +115,13 @@ get_param_info_count(void) if (!param_changed_storage) { size_param_changed_storage_bytes = (param_info_count / bits_per_allocation_unit) + 1; param_changed_storage = calloc(size_param_changed_storage_bytes, 1); - ASSERT(param_changed_storage); + + /* If the allocation fails we need to indicate failure in the + * API by returning PARAM_INVALID + */ + if (param_changed_storage == NULL) { + return 0; + } } return param_info_count; @@ -168,7 +173,8 @@ param_assert_locked(void) static bool handle_in_range(param_t param) { - return (param < get_param_info_count()); + int count = get_param_info_count(); + return (count && param < count); } /** @@ -248,18 +254,19 @@ param_find_internal(const char *name, bool notification) { param_t param; - /* perform a linear search of the known parameters */ - for (param = 0; handle_in_range(param); param++) { - if (!strcmp(param_info_base[param].name, name)) { - if (notification) { - param_set_used_internal(param); - } + /* perform a linear search of the known parameters */ - return param; - } - } + for (param = 0; handle_in_range(param); param++) { + if (!strcmp(param_info_base[param].name, name)) { + if (notification) { + param_set_used_internal(param); + } - /* not found */ + return param; + } + } + + /* not found */ return PARAM_INVALID; } @@ -284,38 +291,38 @@ param_count(void) unsigned param_count_used(void) { - // ensure the allocation has been done - get_param_info_count(); - unsigned count = 0; + unsigned count = 0; - for (unsigned i = 0; i < size_param_changed_storage_bytes; i++) { - for (unsigned j = 0; j < bits_per_allocation_unit; j++) { - if (param_changed_storage[i] & (1 << j)) { - count++; - } - } - } + // ensure the allocation has been done + if (get_param_info_count()) { - return count; + for (unsigned i = 0; i < size_param_changed_storage_bytes; i++) { + for (unsigned j = 0; j < bits_per_allocation_unit; j++) { + if (param_changed_storage[i] & (1 << j)) { + count++; + } + } + } + } + return count; } param_t param_for_index(unsigned index) { - if (index < get_param_info_count()) { + unsigned count = get_param_info_count(); + if (count && index < count) { return (param_t)index; } - return PARAM_INVALID; } param_t param_for_used_index(unsigned index) { - if (index < get_param_info_count()) { - + int count = get_param_info_count(); + if (count && index < count) { /* walk all params and count */ - int count = 0; for (unsigned i = 0; i < (unsigned)size_param_changed_storage_bytes; i++) { for (unsigned j = 0; j < bits_per_allocation_unit; j++) {