Skip to content
  • Adrian Pardini's avatar
    controller: fixes int overflow with properties that span +-INT_MAX · d4f6c8e0
    Adrian Pardini authored and Sebastian Dröge's avatar Sebastian Dröge committed
    When the range for a property is defined as -INT_MAX-1 .. INT_MAX, like
    the xpos in a videomixer the following expression in the macro
    definitions of convert_g_value_to_##type (and the equivalent in
    convert_value_to_##type)
    
    v = pspec->minimum + (g##type) ROUNDING_OP ((pspec->maximum - pspec->minimum) * s);
    
    are converted to:
    
    v = -2147483648 + (g##type) ROUNDING_OP ((2147483647 - -2147483648) * s);
    
    (2147483647 - -2147483648) overflows to -1 and the net result is:
    
    v = -2147483648 + (g##type) ROUNDING_OP (-1 * s);
    
    so v only takes the values -2147483648 for s == 0 and 2147483647
    for s == 1.
    
    Rewriting the expression as minimum*(1-s) + maximum*s gives the correct
    result in this case.
    
    https://bugzilla.gnome.org//show_bug.cgi?id=705630
    d4f6c8e0