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