diff --git a/libraries/AP_Param/AP_Param.cpp b/libraries/AP_Param/AP_Param.cpp index f9aed87658..6e2afd70ff 100644 --- a/libraries/AP_Param/AP_Param.cpp +++ b/libraries/AP_Param/AP_Param.cpp @@ -117,10 +117,20 @@ bool AP_Param::check_group_info(const struct AP_Param::GroupInfo * group_info, uint8_t prefix_length) { uint8_t type; - int8_t max_idx = -1; + uint64_t used_mask = 0; for (uint8_t i=0; (type=group_info[i].type) != AP_PARAM_NONE; i++) { + uint8_t idx = group_info[i].idx; + if (idx >= (1<<_group_level_shift)) { + Debug("idx too large (%u) in %s", idx, group_info[i].name); + return false; + } + if (used_mask & (1ULL<= (1<<_group_level_shift)) { - Debug("idx too large (%u) in %s", idx, group_info[i].name); - return false; - } - if ((int8_t)idx <= max_idx) { - Debug("indexes must be in increasing order in %s", group_info[i].name); - return false; - } - max_idx = (int8_t)idx; uint8_t size = type_size((enum ap_var_type)type); if (size == 0) { Debug("invalid type in %s", group_info[i].name);