[U-Boot] [PATCH v5 01/15] video: bmp: check resolutions of panel/bitmap
Heinrich Schuchardt
xypron.glpk at gmx.de
Fri Oct 25 09:31:10 UTC 2019
On 10/25/19 9:43 AM, Patrice CHOTARD wrote:
> Hi Heinrich
>
> On 10/24/19 10:43 PM, Heinrich Schuchardt wrote:
>> On 10/24/19 4:05 PM, Patrice CHOTARD wrote:
>>> Hi Heinrich, all
>>>
>>> On 10/7/19 7:34 PM, Heinrich Schuchardt wrote:
>>>> On 10/7/19 3:29 PM, Yannick Fertré wrote:
>>>>> If the size of the bitmap is bigger than the size of
>>>>> the panel then errors appear when calculating axis alignment
>>>>> and the copy of bitmap is done outside of framebuffer.
>>>>>
>>>>> Signed-off-by: Yannick Fertré <yannick.fertre at st.com>
>>>>> ---
>>>>> drivers/video/video_bmp.c | 7 +++++++
>>>>> 1 file changed, 7 insertions(+)
>>>>>
>>>>> diff --git a/drivers/video/video_bmp.c b/drivers/video/video_bmp.c
>>>>> index 193f37d..4af1fb4 100644
>>>>> --- a/drivers/video/video_bmp.c
>>>>> +++ b/drivers/video/video_bmp.c
>>>>> @@ -249,6 +249,13 @@ int video_bmp_display(struct udevice *dev, ulong bmp_image, int x, int y,
>>>>>
>>>>> padded_width = (width & 0x3 ? (width & ~0x3) + 4 : width);
>>>>>
>>>>> + /* check if picture size exceeds panel size */
>>>>> + if ((pwidth < width) || (priv->ysize < height)) {
>>>>> + printf("Error: BMP size %d x %d is bigger than panel size %d x %d\n",
>>>>> + (int)width, (int)height, priv->xsize, priv->ysize);
>>>>> + return -EINVAL;
>>>>> + }
>>>>> +
>>>>> if (align) {
>>>>> video_splash_align_axis(&x, priv->xsize, width);
>>>>> video_splash_align_axis(&y, priv->ysize, height);
>>>>
>>>> This is followed by:
>>>>
>>>> if ((x + width) > pwidth)
>>>> width = pwidth - x;
>>>> if ((y + height) > priv->ysize)
>>>> height = priv->ysize - y;
>>>>
>>>> These lines will clip a bitmap that given the left upper corner x, y
>>>> does not fit onto the screen.
>>>>
>>>> So isn't this patch superfluous?
>>>>
>>>> What is missing are checks for x and y.
>>>>
>>>> For testing I have used qemu_x86 and added
>>>>
>>>> #define CONFIG_BMP_24BPP y
>>>>
>>>> to the top of drivers/video/video_bmp.c and loaded a 24bit bitmap.
>>>>
>>>> Clipping works as expected. But passing a value of x exceeding the
>>>> screen width lead to a crash.
>>>>
>>>> What I really dislike in the existing coding is that CONFIG_BMP_*BPP is
>>>> defined in includes instead of using Kconfig but that is a different story.
>>>>
>>>> Best regards
>>>>
>>>> Heinrich
>>>
>>> For information all this series patches have been applied on u-boot/master excepts this one.
>>>
>>> Unfortunately, without this patch, stm32f746-discovery board doesn't boot anymore.
>>
>> I still do not understand why this patch is needed.
>>
>> Could you, please, try to analyze why the board does not boot.
>>
>> What is wrong with the existing code for clipping?
>> Or is the non-booting just coincidence but the bug is somewhere else?
>>
>> What are the values of the parameters passed to video_bmp_display()?
>> Which bitmap file are you using?
>> What is the size of the display?
>
>
> To sum-up, on all STM32 boards, the same BMP splashcreen is used.
>
> In the particular case of STM32F746-Disco board, the panel size is smaller then the BMP size.
>
> So, some size check must be done to avoid overflow when writing inside the framebuffer.
That is why we have lines to clip images:
if ((x + width) > pwidth)
width = pwidth - x;
if ((y + height) > priv->ysize)
height = priv->ysize - y;
Why is this not working in you case?
Best regards
Heinrich
>
> If needed, Yannick, which is multimedia expert, can give you more precise details.
>
> Thanks
>
> Patrice
>
>
>>
>> Best regards
>>
>> Heinrich
>>
>>>
>>> Heinrich, could this patch be merged, waiting for a clean patch from Yannick ?
>>>
>>> Regards
>>>
>>> Patrice
>>>
>>
>
More information about the U-Boot
mailing list