hvmloader: use bound checking in get_module_entry
authorWei Liu <wei.liu2@citrix.com>
Mon, 22 Aug 2016 12:47:53 +0000 (13:47 +0100)
committerWei Liu <wei.liu2@citrix.com>
Mon, 22 Aug 2016 13:20:19 +0000 (14:20 +0100)
Coverity complains:

overflow_before_widen: Potentially overflowing expression
info->nr_modules * 32U with type unsigned int (32 bits, unsigned) is
evaluated using 32-bit arithmetic, and then used in a context that
expects an expression of type uint64_t (64 bits, unsigned).

The overflow is unlikely to happen in reality because we only expect a
few modules.

Fix that by converting the check to use bound checking to placate
Coverity.

Signed-off-by: Wei Liu <wei.liu2@citrix.com>
Acked-by: Jan Beulich <jbeulich@suse.com>
tools/firmware/hvmloader/hvmloader.c

index 7b32d86d39e596a964a036883bafdb90338e8143..bbd4e3454ae808546fb8f515dc453b3ab36618b6 100644 (file)
@@ -272,8 +272,8 @@ const struct hvm_modlist_entry *get_module_entry(
 
     if ( !modlist ||
          info->modlist_paddr > UINTPTR_MAX ||
-         (info->modlist_paddr + info->nr_modules * sizeof(*modlist) - 1)
-            > UINTPTR_MAX )
+         (UINTPTR_MAX - (uintptr_t)info->modlist_paddr) / sizeof(*modlist)
+         < info->nr_modules )
         return NULL;
 
     for ( i = 0; i < info->nr_modules; i++ )