* src/svg/ftsvg.c (ft_svg_property_set): Disallow NULL pointers.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
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;
}