dyne / frei0r

A large collection of free and portable video plugins
https://frei0r.dyne.org/
GNU General Public License v2.0
427 stars 89 forks source link

rgbsplit0r: Fix bounds checking and initialization #36

Closed rrrapha closed 5 years ago

rrrapha commented 5 years ago

Resolves #35

jaromil commented 5 years ago

It is a sane fix. The implicit conversion is already producing a warning in the new test builds:

warning: unknown warning option '-Wrestrict' [-Wunknown-warning-option]
/Users/travis/build/dyne/frei0r/src/filter/rgbsplit0r/rgbsplit0r.c:112:20: warning: implicit conversion from 'double' to 'unsigned int' changes value from 0.5 to 0 [-Wliteral-conversion]
    inst->shiftY = 0.5;
                 ~ ^~~
/Users/travis/build/dyne/frei0r/src/filter/rgbsplit0r/rgbsplit0r.c:113:20: warning: implicit conversion from 'double' to 'unsigned int' changes value from 0.5 to 0 [-Wliteral-conversion]
    inst->shiftX = 0.5;
                 ~ ^~~
3 warnings generated.
warning: unknown warning option '-Wrestrict' [-Wunknown-warning-option]
/Users/travis/build/dyne/frei0r/src/filter/rgbsplit0r/rgbsplit0r.c:112:20: warning: implicit conversion from 'double' to 'unsigned int' changes value from 0.5 to 0 [-Wliteral-conversion]
    inst->shiftY = 0.5;
                 ~ ^~~
/Users/travis/build/dyne/frei0r/src/filter/rgbsplit0r/rgbsplit0r.c:113:20: warning: implicit conversion from 'double' to 'unsigned int' changes value from 0.5 to 0 [-Wliteral-conversion]
    inst->shiftX = 0.5;
                 ~ ^~~
3 warnings generated.

the check assumes shiftX is always positive which is the behavior of the filter

switch (param_index)
    {

        case 0 : // vertical shift
        {
            // scale to [-1/16..1/16]
            double shiftY = *((double*)param) - 0.5;

            // Convert to range from 0 to one eighth of height
            shiftY = ((inst->height / 8) * shiftY);

            inst->shiftY = (unsigned int)shiftY;
            break;
        }

        case 1 : // horizontal shift
        {
            // scale to [-1/16..1/16]
            double shiftX = *((double*)param) - 0.5;

            // Convert to range from 0 to one eighth of width
            shiftX = ((inst->width / 8) * shiftX);

            inst->shiftX = (unsigned int)shiftX;
            break;
        }
}