1 /***************************************************************************/
2 /*                                                                         */
3 /*  gxvcommn.h                                                             */
4 /*                                                                         */
5 /*    TrueTypeGX/AAT common tables validation (specification).             */
6 /*                                                                         */
7 /*  Copyright 2004, 2005, 2012                                             */
8 /*  by suzuki toshiya, Masatake YAMATO, Red Hat K.K.,                      */
9 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
10 /*                                                                         */
11 /*  This file is part of the FreeType project, and may only be used,       */
12 /*  modified, and distributed under the terms of the FreeType project      */
13 /*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
14 /*  this file you indicate that you have read the license and              */
15 /*  understand and accept it fully.                                        */
16 /*                                                                         */
17 /***************************************************************************/
18 
19 /***************************************************************************/
20 /*                                                                         */
21 /* gxvalid is derived from both gxlayout module and otvalid module.        */
22 /* Development of gxlayout is supported by the Information-technology      */
23 /* Promotion Agency(IPA), Japan.                                           */
24 /*                                                                         */
25 /***************************************************************************/
26 
27 
28   /*
29    * keywords in variable naming
30    * ---------------------------
31    *  table: Of type FT_Bytes, pointing to the start of this table/subtable.
32    *  limit: Of type FT_Bytes, pointing to the end of this table/subtable,
33    *         including padding for alignment.
34    *  offset: Of type FT_UInt, the number of octets from the start to target.
35    *  length: Of type FT_UInt, the number of octets from the start to the
36    *          end in this table/subtable, including padding for alignment.
37    *
38    *  _MIN, _MAX: Should be added to the tail of macros, as INT_MIN, etc.
39    */
40 
41 
42 #ifndef __GXVCOMMN_H__
43 #define __GXVCOMMN_H__
44 
45 
46 #include <ft2build.h>
47 #include "gxvalid.h"
48 #include FT_INTERNAL_DEBUG_H
49 #include FT_SFNT_NAMES_H
50 
51 
52 FT_BEGIN_HEADER
53 
54 
55   /* some variables are not evaluated or only used in trace */
56 
57 #ifdef  FT_DEBUG_LEVEL_TRACE
58 #define GXV_LOAD_TRACE_VARS
59 #else
60 #undef  GXV_LOAD_TRACE_VARS
61 #endif
62 
63 #undef GXV_LOAD_UNUSED_VARS /* debug purpose */
64 
65 #define IS_PARANOID_VALIDATION          ( valid->root->level >= FT_VALIDATE_PARANOID )
66 #define GXV_SET_ERR_IF_PARANOID( err )  { if ( IS_PARANOID_VALIDATION ) ( err ); }
67 
68   /*************************************************************************/
69   /*************************************************************************/
70   /*****                                                               *****/
71   /*****                         VALIDATION                            *****/
72   /*****                                                               *****/
73   /*************************************************************************/
74   /*************************************************************************/
75 
76   typedef struct GXV_ValidatorRec_*  GXV_Validator;
77 
78 
79 #define DUMMY_LIMIT 0
80 
81   typedef void
82   (*GXV_Validate_Func)( FT_Bytes       table,
83                         FT_Bytes       limit,
84                         GXV_Validator  valid );
85 
86 
87   /* ====================== LookupTable Validator ======================== */
88 
89   typedef union  GXV_LookupValueDesc_
90   {
91     FT_UShort u;
92     FT_Short  s;
93 
94   } GXV_LookupValueDesc;
95 
96   typedef const GXV_LookupValueDesc* GXV_LookupValueCPtr;
97 
98   typedef enum  GXV_LookupValue_SignSpec_
99   {
100     GXV_LOOKUPVALUE_UNSIGNED = 0,
101     GXV_LOOKUPVALUE_SIGNED
102 
103   } GXV_LookupValue_SignSpec;
104 
105 
106   typedef void
107   (*GXV_Lookup_Value_Validate_Func)( FT_UShort            glyph,
108                                      GXV_LookupValueCPtr  value_p,
109                                      GXV_Validator        valid );
110 
111   typedef GXV_LookupValueDesc
112   (*GXV_Lookup_Fmt4_Transit_Func)( FT_UShort            relative_gindex,
113                                    GXV_LookupValueCPtr  base_value_p,
114                                    FT_Bytes             lookuptbl_limit,
115                                    GXV_Validator        valid );
116 
117 
118   /* ====================== StateTable Validator ========================= */
119 
120   typedef enum  GXV_GlyphOffset_Format_
121   {
122     GXV_GLYPHOFFSET_NONE   = -1,
123     GXV_GLYPHOFFSET_UCHAR  = 2,
124     GXV_GLYPHOFFSET_CHAR,
125     GXV_GLYPHOFFSET_USHORT = 4,
126     GXV_GLYPHOFFSET_SHORT,
127     GXV_GLYPHOFFSET_ULONG  = 8,
128     GXV_GLYPHOFFSET_LONG
129 
130   } GXV_GlyphOffset_Format;
131 
132 
133 #define GXV_GLYPHOFFSET_FMT( table )           \
134         ( valid->table.entry_glyphoffset_fmt )
135 
136 #define GXV_GLYPHOFFSET_SIZE( table )              \
137         ( valid->table.entry_glyphoffset_fmt / 2 )
138 
139 
140   /* ----------------------- 16bit StateTable ---------------------------- */
141 
142   typedef union  GXV_StateTable_GlyphOffsetDesc_
143   {
144     FT_Byte    uc;
145     FT_UShort  u;       /* same as GXV_LookupValueDesc */
146     FT_ULong   ul;
147     FT_Char    c;
148     FT_Short   s;       /* same as GXV_LookupValueDesc */
149     FT_Long    l;
150 
151   } GXV_StateTable_GlyphOffsetDesc;
152 
153   typedef const GXV_StateTable_GlyphOffsetDesc* GXV_StateTable_GlyphOffsetCPtr;
154 
155   typedef void
156   (*GXV_StateTable_Subtable_Setup_Func)( FT_UShort      table_size,
157                                          FT_UShort      classTable,
158                                          FT_UShort      stateArray,
159                                          FT_UShort      entryTable,
160                                          FT_UShort*     classTable_length_p,
161                                          FT_UShort*     stateArray_length_p,
162                                          FT_UShort*     entryTable_length_p,
163                                          GXV_Validator  valid );
164 
165   typedef void
166   (*GXV_StateTable_Entry_Validate_Func)(
167      FT_Byte                         state,
168      FT_UShort                       flags,
169      GXV_StateTable_GlyphOffsetCPtr  glyphOffset_p,
170      FT_Bytes                        statetable_table,
171      FT_Bytes                        statetable_limit,
172      GXV_Validator                   valid );
173 
174   typedef void
175   (*GXV_StateTable_OptData_Load_Func)( FT_Bytes       table,
176                                        FT_Bytes       limit,
177                                        GXV_Validator  valid );
178 
179   typedef struct  GXV_StateTable_ValidatorRec_
180   {
181     GXV_GlyphOffset_Format              entry_glyphoffset_fmt;
182     void*                               optdata;
183 
184     GXV_StateTable_Subtable_Setup_Func  subtable_setup_func;
185     GXV_StateTable_Entry_Validate_Func  entry_validate_func;
186     GXV_StateTable_OptData_Load_Func    optdata_load_func;
187 
188   } GXV_StateTable_ValidatorRec, *GXV_StateTable_ValidatorRecData;
189 
190 
191   /* ---------------------- 32bit XStateTable ---------------------------- */
192 
193   typedef GXV_StateTable_GlyphOffsetDesc  GXV_XStateTable_GlyphOffsetDesc;
194 
195   typedef const GXV_XStateTable_GlyphOffsetDesc* GXV_XStateTable_GlyphOffsetCPtr;
196 
197   typedef void
198   (*GXV_XStateTable_Subtable_Setup_Func)( FT_ULong       table_size,
199                                           FT_ULong       classTable,
200                                           FT_ULong       stateArray,
201                                           FT_ULong       entryTable,
202                                           FT_ULong*      classTable_length_p,
203                                           FT_ULong*      stateArray_length_p,
204                                           FT_ULong*      entryTable_length_p,
205                                           GXV_Validator  valid );
206 
207   typedef void
208   (*GXV_XStateTable_Entry_Validate_Func)(
209      FT_UShort                       state,
210      FT_UShort                       flags,
211      GXV_StateTable_GlyphOffsetCPtr  glyphOffset_p,
212      FT_Bytes                        xstatetable_table,
213      FT_Bytes                        xstatetable_limit,
214      GXV_Validator                   valid );
215 
216 
217   typedef GXV_StateTable_OptData_Load_Func  GXV_XStateTable_OptData_Load_Func;
218 
219 
220   typedef struct  GXV_XStateTable_ValidatorRec_
221   {
222     int                                  entry_glyphoffset_fmt;
223     void*                                optdata;
224 
225     GXV_XStateTable_Subtable_Setup_Func  subtable_setup_func;
226     GXV_XStateTable_Entry_Validate_Func  entry_validate_func;
227     GXV_XStateTable_OptData_Load_Func    optdata_load_func;
228 
229     FT_ULong                             nClasses;
230     FT_UShort                            maxClassID;
231 
232   } GXV_XStateTable_ValidatorRec, *GXV_XStateTable_ValidatorRecData;
233 
234 
235   /* ===================================================================== */
236 
237   typedef struct  GXV_ValidatorRec_
238   {
239     FT_Validator  root;
240 
241     FT_Face       face;
242     void*         table_data;
243 
244     FT_ULong      subtable_length;
245 
246     GXV_LookupValue_SignSpec        lookupval_sign;
247     GXV_Lookup_Value_Validate_Func  lookupval_func;
248     GXV_Lookup_Fmt4_Transit_Func    lookupfmt4_trans;
249     FT_Bytes                        lookuptbl_head;
250 
251     FT_UShort  min_gid;
252     FT_UShort  max_gid;
253 
254     GXV_StateTable_ValidatorRec     statetable;
255     GXV_XStateTable_ValidatorRec    xstatetable;
256 
257 #ifdef FT_DEBUG_LEVEL_TRACE
258     FT_UInt             debug_indent;
259     const FT_String*    debug_function_name[3];
260 #endif
261 
262   } GXV_ValidatorRec;
263 
264 
265 #define GXV_TABLE_DATA( tag, field )                           \
266         ( ( (GXV_ ## tag ## _Data)valid->table_data )->field )
267 
268 #undef  FT_INVALID_
269 #define FT_INVALID_( _prefix, _error )                         \
270           ft_validator_error( valid->root, _prefix ## _error )
271 
272 #define GXV_LIMIT_CHECK( _count )                                     \
273           FT_BEGIN_STMNT                                              \
274             if ( p + _count > ( limit? limit : valid->root->limit ) ) \
275               FT_INVALID_TOO_SHORT;                                   \
276           FT_END_STMNT
277 
278 
279 #ifdef FT_DEBUG_LEVEL_TRACE
280 
281 #define GXV_INIT  valid->debug_indent = 0
282 
283 #define GXV_NAME_ENTER( name )                             \
284           FT_BEGIN_STMNT                                   \
285             valid->debug_indent += 2;                      \
286             FT_TRACE4(( "%*.s", valid->debug_indent, 0 )); \
287             FT_TRACE4(( "%s table\n", name ));             \
288           FT_END_STMNT
289 
290 #define GXV_EXIT  valid->debug_indent -= 2
291 
292 #define GXV_TRACE( s )                                     \
293           FT_BEGIN_STMNT                                   \
294             FT_TRACE4(( "%*.s", valid->debug_indent, 0 )); \
295             FT_TRACE4( s );                                \
296           FT_END_STMNT
297 
298 #else /* !FT_DEBUG_LEVEL_TRACE */
299 
300 #define GXV_INIT                do { } while ( 0 )
301 #define GXV_NAME_ENTER( name )  do { } while ( 0 )
302 #define GXV_EXIT                do { } while ( 0 )
303 
304 #define GXV_TRACE( s )          do { } while ( 0 )
305 
306 #endif  /* !FT_DEBUG_LEVEL_TRACE */
307 
308 
309   /*************************************************************************/
310   /*************************************************************************/
311   /*****                                                               *****/
312   /*****                    32bit alignment checking                   *****/
313   /*****                                                               *****/
314   /*************************************************************************/
315   /*************************************************************************/
316 
317 #define GXV_32BIT_ALIGNMENT_VALIDATE( a ) \
318           FT_BEGIN_STMNT                  \
319             {                             \
320               if ( (a) & 3 )              \
321                 FT_INVALID_OFFSET;        \
322             }                             \
323           FT_END_STMNT
324 
325 
326   /*************************************************************************/
327   /*************************************************************************/
328   /*****                                                               *****/
329   /*****                    Dumping Binary Data                        *****/
330   /*****                                                               *****/
331   /*************************************************************************/
332   /*************************************************************************/
333 
334 #define GXV_TRACE_HEXDUMP( p, len )                     \
335           FT_BEGIN_STMNT                                \
336             {                                           \
337               FT_Bytes  b;                              \
338                                                         \
339                                                         \
340               for ( b = p; b < (FT_Bytes)p + len; b++ ) \
341                 FT_TRACE1(("\\x%02x", *b)) ;            \
342             }                                           \
343           FT_END_STMNT
344 
345 #define GXV_TRACE_HEXDUMP_C( p, len )                   \
346           FT_BEGIN_STMNT                                \
347             {                                           \
348               FT_Bytes  b;                              \
349                                                         \
350                                                         \
351               for ( b = p; b < (FT_Bytes)p + len; b++ ) \
352                 if ( 0x40 < *b && *b < 0x7e )           \
353                   FT_TRACE1(("%c", *b)) ;               \
354                 else                                    \
355                   FT_TRACE1(("\\x%02x", *b)) ;          \
356             }                                           \
357           FT_END_STMNT
358 
359 #define GXV_TRACE_HEXDUMP_SFNTNAME( n )               \
360           GXV_TRACE_HEXDUMP( n.string, n.string_len )
361 
362 
363   /*************************************************************************/
364   /*************************************************************************/
365   /*****                                                               *****/
366   /*****                         LOOKUP TABLE                          *****/
367   /*****                                                               *****/
368   /*************************************************************************/
369   /*************************************************************************/
370 
371   FT_LOCAL( void )
372   gxv_BinSrchHeader_validate( FT_Bytes       p,
373                               FT_Bytes       limit,
374                               FT_UShort*     unitSize_p,
375                               FT_UShort*     nUnits_p,
376                               GXV_Validator  valid );
377 
378   FT_LOCAL( void )
379   gxv_LookupTable_validate( FT_Bytes       table,
380                             FT_Bytes       limit,
381                             GXV_Validator  valid );
382 
383 
384   /*************************************************************************/
385   /*************************************************************************/
386   /*****                                                               *****/
387   /*****                          Glyph ID                             *****/
388   /*****                                                               *****/
389   /*************************************************************************/
390   /*************************************************************************/
391 
392   FT_LOCAL( FT_Int )
393   gxv_glyphid_validate( FT_UShort      gid,
394                         GXV_Validator  valid );
395 
396 
397   /*************************************************************************/
398   /*************************************************************************/
399   /*****                                                               *****/
400   /*****                        CONTROL POINT                          *****/
401   /*****                                                               *****/
402   /*************************************************************************/
403   /*************************************************************************/
404 
405   FT_LOCAL( void )
406   gxv_ctlPoint_validate( FT_UShort      gid,
407                          FT_Short       ctl_point,
408                          GXV_Validator  valid );
409 
410 
411   /*************************************************************************/
412   /*************************************************************************/
413   /*****                                                               *****/
414   /*****                          SFNT NAME                            *****/
415   /*****                                                               *****/
416   /*************************************************************************/
417   /*************************************************************************/
418 
419   FT_LOCAL( void )
420   gxv_sfntName_validate( FT_UShort      name_index,
421                          FT_UShort      min_index,
422                          FT_UShort      max_index,
423                          GXV_Validator  valid );
424 
425 
426   /*************************************************************************/
427   /*************************************************************************/
428   /*****                                                               *****/
429   /*****                          STATE TABLE                          *****/
430   /*****                                                               *****/
431   /*************************************************************************/
432   /*************************************************************************/
433 
434   FT_LOCAL( void )
435   gxv_StateTable_subtable_setup( FT_UShort      table_size,
436                                  FT_UShort      classTable,
437                                  FT_UShort      stateArray,
438                                  FT_UShort      entryTable,
439                                  FT_UShort*     classTable_length_p,
440                                  FT_UShort*     stateArray_length_p,
441                                  FT_UShort*     entryTable_length_p,
442                                  GXV_Validator  valid );
443 
444   FT_LOCAL( void )
445   gxv_XStateTable_subtable_setup( FT_ULong       table_size,
446                                   FT_ULong       classTable,
447                                   FT_ULong       stateArray,
448                                   FT_ULong       entryTable,
449                                   FT_ULong*      classTable_length_p,
450                                   FT_ULong*      stateArray_length_p,
451                                   FT_ULong*      entryTable_length_p,
452                                   GXV_Validator  valid );
453 
454   FT_LOCAL( void )
455   gxv_StateTable_validate( FT_Bytes       table,
456                            FT_Bytes       limit,
457                            GXV_Validator  valid );
458 
459   FT_LOCAL( void )
460   gxv_XStateTable_validate( FT_Bytes       table,
461                             FT_Bytes       limit,
462                             GXV_Validator  valid );
463 
464 
465   /*************************************************************************/
466   /*************************************************************************/
467   /*****                                                               *****/
468   /*****                 UTILITY MACROS AND FUNCTIONS                  *****/
469   /*****                                                               *****/
470   /*************************************************************************/
471   /*************************************************************************/
472 
473   FT_LOCAL( void )
474   gxv_array_getlimits_byte( FT_Bytes       table,
475                             FT_Bytes       limit,
476                             FT_Byte*       min,
477                             FT_Byte*       max,
478                             GXV_Validator  valid );
479 
480   FT_LOCAL( void )
481   gxv_array_getlimits_ushort( FT_Bytes       table,
482                               FT_Bytes       limit,
483                               FT_UShort*     min,
484                               FT_UShort*     max,
485                               GXV_Validator  valid );
486 
487   FT_LOCAL( void )
488   gxv_set_length_by_ushort_offset( FT_UShort*     offset,
489                                    FT_UShort**    length,
490                                    FT_UShort*     buff,
491                                    FT_UInt        nmemb,
492                                    FT_UShort      limit,
493                                    GXV_Validator  valid );
494 
495   FT_LOCAL( void )
496   gxv_set_length_by_ulong_offset( FT_ULong*      offset,
497                                   FT_ULong**     length,
498                                   FT_ULong*      buff,
499                                   FT_UInt        nmemb,
500                                   FT_ULong       limit,
501                                   GXV_Validator  valid);
502 
503 
504 #define GXV_SUBTABLE_OFFSET_CHECK( _offset )          \
505           FT_BEGIN_STMNT                              \
506             if ( (_offset) > valid->subtable_length ) \
507               FT_INVALID_OFFSET;                      \
508           FT_END_STMNT
509 
510 #define GXV_SUBTABLE_LIMIT_CHECK( _count )                  \
511           FT_BEGIN_STMNT                                    \
512             if ( ( p + (_count) - valid->subtable_start ) > \
513                    valid->subtable_length )                 \
514               FT_INVALID_TOO_SHORT;                         \
515           FT_END_STMNT
516 
517 #define GXV_USHORT_TO_SHORT( _us )                                    \
518           ( ( 0x8000U < ( _us ) ) ? ( ( _us ) - 0x8000U ) : ( _us ) )
519 
520 #define GXV_STATETABLE_HEADER_SIZE  ( 2 + 2 + 2 + 2 )
521 #define GXV_STATEHEADER_SIZE        GXV_STATETABLE_HEADER_SIZE
522 
523 #define GXV_XSTATETABLE_HEADER_SIZE  ( 4 + 4 + 4 + 4 )
524 #define GXV_XSTATEHEADER_SIZE        GXV_XSTATETABLE_HEADER_SIZE
525 
526 
527   /*************************************************************************/
528   /*************************************************************************/
529   /*****                                                               *****/
530   /*****                        Table overlapping                      *****/
531   /*****                                                               *****/
532   /*************************************************************************/
533   /*************************************************************************/
534 
535   typedef struct  GXV_odtect_DataRec_
536   {
537     FT_Bytes    start;
538     FT_ULong    length;
539     FT_String*  name;
540 
541   } GXV_odtect_DataRec,  *GXV_odtect_Data;
542 
543   typedef struct  GXV_odtect_RangeRec_
544   {
545     FT_UInt          nRanges;
546     GXV_odtect_Data  range;
547 
548   } GXV_odtect_RangeRec, *GXV_odtect_Range;
549 
550 
551   FT_LOCAL( void )
552   gxv_odtect_add_range( FT_Bytes          start,
553                         FT_ULong          length,
554                         const FT_String*  name,
555                         GXV_odtect_Range  odtect );
556 
557   FT_LOCAL( void )
558   gxv_odtect_validate( GXV_odtect_Range  odtect,
559                        GXV_Validator     valid );
560 
561 
562 #define GXV_ODTECT( n, odtect )                              \
563           GXV_odtect_DataRec   odtect ## _range[n];          \
564           GXV_odtect_RangeRec  odtect ## _rec = { 0, NULL }; \
565           GXV_odtect_Range     odtect = NULL
566 
567 #define GXV_ODTECT_INIT( odtect )                      \
568           FT_BEGIN_STMNT                               \
569             odtect ## _rec.nRanges = 0;                \
570             odtect ## _rec.range   = odtect ## _range; \
571             odtect                 = & odtect ## _rec; \
572           FT_END_STMNT
573 
574 
575  /* */
576 
577 FT_END_HEADER
578 
579 #endif /* __GXVCOMMN_H__ */
580 
581 
582 /* END */
583