Skip to content
Snippets Groups Projects
  • Zhang Boyang's avatar
    c2491cb8
    fbutil: Fix integer overflow · c2491cb8
    Zhang Boyang authored
    
    Expressions like u64 = u32 * u32 are unsafe because their products are
    truncated to u32 even if left hand side is u64. This patch fixes all
    problems like that one in fbutil.
    
    To get right result not only left hand side have to be u64 but it's also
    necessary to cast at least one of the operands of all leaf operators of
    right hand side to u64, e.g. u64 = u32 * u32 + u32 * u32 should be
    u64 = (u64)u32 * u32 + (u64)u32 * u32.
    
    For 1-bit bitmaps grub_uint64_t have to be used. It's safe because any
    combination of values in (grub_uint64_t)u32 * u32 + u32 expression will
    not overflow grub_uint64_t.
    
    Other expressions like ptr + u32 * u32 + u32 * u32 are also vulnerable.
    They should be ptr + (grub_addr_t)u32 * u32 + (grub_addr_t)u32 * u32.
    
    This patch also adds a comment to grub_video_fb_get_video_ptr() which
    says it's arguments must be valid and no sanity check is performed
    (like its siblings in grub-core/video/fb/fbutil.c).
    
    Signed-off-by: default avatarZhang Boyang <zhangboyang.id@gmail.com>
    Reviewed-by: default avatarDaniel Kiper <daniel.kiper@oracle.com>
    c2491cb8
    History
    fbutil: Fix integer overflow
    Zhang Boyang authored
    
    Expressions like u64 = u32 * u32 are unsafe because their products are
    truncated to u32 even if left hand side is u64. This patch fixes all
    problems like that one in fbutil.
    
    To get right result not only left hand side have to be u64 but it's also
    necessary to cast at least one of the operands of all leaf operators of
    right hand side to u64, e.g. u64 = u32 * u32 + u32 * u32 should be
    u64 = (u64)u32 * u32 + (u64)u32 * u32.
    
    For 1-bit bitmaps grub_uint64_t have to be used. It's safe because any
    combination of values in (grub_uint64_t)u32 * u32 + u32 expression will
    not overflow grub_uint64_t.
    
    Other expressions like ptr + u32 * u32 + u32 * u32 are also vulnerable.
    They should be ptr + (grub_addr_t)u32 * u32 + (grub_addr_t)u32 * u32.
    
    This patch also adds a comment to grub_video_fb_get_video_ptr() which
    says it's arguments must be valid and no sanity check is performed
    (like its siblings in grub-core/video/fb/fbutil.c).
    
    Signed-off-by: default avatarZhang Boyang <zhangboyang.id@gmail.com>
    Reviewed-by: default avatarDaniel Kiper <daniel.kiper@oracle.com>