Re: [PATCH] Fix undefined behaviour

Klaus Schmidinger <[email protected]> Tue, 6 Dec 2022 17:58:13 +0100
Newsgroups gmane.linux.vdr
Message-ID <[email protected]>
On 06.12.22 12:24, Marko Mäkelä wrote:
> ...
> diff --git a/dvbsubtitle.c b/dvbsubtitle.c
> index c1dfef4d..2d22d963 100644
> --- a/dvbsubtitle.c
> +++ b/dvbsubtitle.c
> @@ -1770,6 +1770,8 @@ void cDvbSubtitleConverter::FinishPage(cDvbSubtitlePage *Page)
>        return;
>     int NumAreas;
>     tArea *Areas = Page->GetAreas(NumAreas);
> +  if (!Areas)
> +     return;
>     tArea AreaCombined = Page->CombineAreas(NumAreas, Areas);
>     tArea AreaOsd = Page->ScaleArea(AreaCombined, osdFactorX, osdFactorY);
>     int Bpp = 8;

OK, let's settle for this (if there are no areas, the check for 'NumAreas > 0' is obsolete):

--- dvbsubtitle.c       2021/03/17 15:24:34     5.1
+++ dvbsubtitle.c       2022/12/06 16:44:02
@@ -1770,11 +1770,13 @@
       return;
    int NumAreas;
    tArea *Areas = Page->GetAreas(NumAreas);
+  if (!Areas)
+     return;
    tArea AreaCombined = Page->CombineAreas(NumAreas, Areas);
    tArea AreaOsd = Page->ScaleArea(AreaCombined, osdFactorX, osdFactorY);
    int Bpp = 8;
    bool Reduced = false;
-  if (osd && NumAreas > 0) {
+  if (osd) {
       while (osd->CanHandleAreas(&AreaOsd, 1) != oeOk) {
             dbgoutput("CanHandleAreas: %d<br>\n", osd->CanHandleAreas(&AreaOsd, 1));
             int HalfBpp = Bpp / 2;

> ... > @@ -74,7 +74,8 @@ cGlyph::cGlyph(uint CharCode, FT_GlyphSlotRec_ *GlyphData)
>     rows = GlyphData->bitmap.rows;
>     pitch = GlyphData->bitmap.pitch;
>     bitmap = MALLOC(uchar, rows * pitch);
> -  memcpy(bitmap, GlyphData->bitmap.buffer, rows * pitch);
> +  if (int bytes = rows * pitch)
> +     memcpy(bitmap, GlyphData->bitmap.buffer, bytes);
>   }
>   
>   cGlyph::~cGlyph()

OK, 'man malloc' says "If size is 0, then malloc() returns either NULL, or a unique pointer value that can later
be successfully passed to free()". Since memcpy() must not be called with a NULL pointer, you win.

Klaus


_______________________________________________
vdr mailing list
[email protected]
https://www.linuxtv.org/cgi-bin/mailman/listinfo/vdr