Performs basic checks to see if SVG data is valid or not.

This commit is contained in:
Moazin Khatti 2019-07-30 00:40:41 +05:00
parent d7f6f8b16d
commit 0e8e132bd7
1 changed files with 36 additions and 2 deletions

View File

@ -35,6 +35,24 @@
#include "ttsvg.h"
/* SVG table looks like:
* --------------------------------------
* Bytes: Field |
* --------------------------------------
* 2 version
* 4 offsetToSVGDocumentList
* 4 reserved
* 2 numEntries (non-zero)
* 12*numEntries documentList
*
* Since numEntries must be at least one, minimum
* size of SVG table is 24. Everything apart from
* the documentList makes 12 bytes.
*/
#define SVG_HEADER_BASE_SIZE 12
#define SVG_HEADER_MIN_SIZE 24
/* TODO: (OT-SVG) Decide whether to add documentation here or not */
typedef struct Svg_
@ -69,6 +87,9 @@
if( error )
goto NoSVG;
if ( table_size < SVG_HEADER_MIN_SIZE )
goto InvalidTable;
if( FT_FRAME_EXTRACT( table_size, table ))
goto NoSVG;
@ -77,7 +98,14 @@
goto NoSVG;
p = table;
svg->version = FT_NEXT_USHORT( p );
svg->version = FT_NEXT_USHORT( p );
/* At the time of writing this, only version 0 exists,
* and only that is supported by FreeType
*/
if ( svg->version != 0 )
goto InvalidTable;
offsetToSVGDocumentList = FT_NEXT_ULONG( p );
if( offsetToSVGDocumentList == 0 )
@ -88,6 +116,9 @@
p = svg->svg_doc_list;
svg->num_entries = FT_NEXT_USHORT( p );
if ( ( svg->num_entries*12 + SVG_HEADER_BASE_SIZE ) > table_size )
goto InvalidTable;
FT_TRACE3(( "version: %d\n", svg->version ));
FT_TRACE3(( "num entiries: %d\n", svg->num_entries ));
@ -244,7 +275,10 @@
*doc_length = mid_doc.length;
*start_glyph = mid_doc.start_glyph_id;
*end_glyph = mid_doc.end_glyph_id;
error = FT_Err_Ok;
if ( *doc_length == 0 )
error = FT_THROW( Invalid_SVG_Document );
else
error = FT_Err_Ok;
}
return error;
}