intel/decoder: fix the possible out of bounds group_iter
authorAndrii Simiklit <andrii.simiklit@globallogic.com>
Mon, 20 Aug 2018 16:20:59 +0000 (19:20 +0300)
committerLionel Landwerlin <lionel.g.landwerlin@intel.com>
Mon, 3 Sep 2018 10:14:30 +0000 (11:14 +0100)
The "gen_group_get_length" function can return a negative value
and it can lead to the out of bounds group_iter.

v2: printing of "unknown command type" was added
v3: just the asserts are added

Signed-off-by: Andrii Simiklit <andrii.simiklit@globallogic.com>
Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
src/intel/common/gen_decoder.c

index ec22b545492e4d6605c419d2b4815245f3a05459..c6c213fcd1146de414b74a3fa0b12937eb6eb3f0 100644 (file)
@@ -804,8 +804,10 @@ static bool
 iter_more_groups(const struct gen_field_iterator *iter)
 {
    if (iter->group->variable) {
+      int length = gen_group_get_length(iter->group, iter->p);
+      assert(length >= 0 && "error the length is unknown!");
       return iter_group_offset_bits(iter, iter->group_iter + 1) <
-              (gen_group_get_length(iter->group, iter->p) * 32);
+              (length * 32);
    } else {
       return (iter->group_iter + 1) < iter->group->group_count ||
          iter->group->next != NULL;
@@ -997,6 +999,7 @@ gen_field_iterator_init(struct gen_field_iterator *iter,
    iter->p_bit = p_bit;
 
    int length = gen_group_get_length(iter->group, iter->p);
+   assert(length >= 0 && "error the length is unknown!");
    iter->p_end = length >= 0 ? &p[length] : NULL;
    iter->print_colors = print_colors;
 }