Commit ef48a332712ab4b3b509a3a2f2f045763c238b61

Werner Lemberg 2022-01-23T19:05:15

* src/svg/ftsvg.c (ft_svg_property_set): Disallow NULL pointers.

diff --git a/include/freetype/otsvg.h b/include/freetype/otsvg.h
index 2b3c00f..2caadfd 100644
--- a/include/freetype/otsvg.h
+++ b/include/freetype/otsvg.h
@@ -223,6 +223,8 @@ FT_BEGIN_HEADER
    *   For example, in the preset hook one can draw the glyph on a recorder
    *   surface and later create a bitmap surface from it in the render hook.
    *
+   *   All four hooks must be non-NULL.
+   *
    * @fields:
    *   init_svg ::
    *     The initialization hook.
diff --git a/src/svg/ftsvg.c b/src/svg/ftsvg.c
index 569f8cc..55c5071 100644
--- a/src/svg/ftsvg.c
+++ b/src/svg/ftsvg.c
@@ -168,16 +168,34 @@
 
 
       if ( value_is_string == TRUE )
-        return FT_THROW( Invalid_Argument );
+      {
+        error = FT_THROW( Invalid_Argument );
+        goto Exit;
+      }
 
       hooks = (SVG_RendererHooks*)value;
 
+      if ( !hooks->init_svg    ||
+           !hooks->free_svg    ||
+           !hooks->render_svg  ||
+           !hooks->preset_slot )
+      {
+        FT_TRACE0(( "ft_svg_property_set:"
+                    " SVG rendering hooks not set because\n" ));
+        FT_TRACE0(( "                    "
+                    " at least one function pointer is NULL\n" ));
+
+        error = FT_THROW( Invalid_Argument );
+        goto Exit;
+      }
+
       renderer->hooks     = *hooks;
       renderer->hooks_set = TRUE;
     }
     else
       error = FT_THROW( Missing_Property );
 
+  Exit:
     return error;
   }