95 {
98
102
104
107
110
113
115 {
116#undef FT_STRUCTURE
117#define FT_STRUCTURE WOFF_HeaderRec
118
134 };
135
136
139
142
143
146
147
149 woff.num_tables == 0 ||
150 44 + woff.num_tables * 20UL >= woff.length ||
151 12 + woff.num_tables * 16UL >= woff.totalSfntSize ||
152 ( woff.totalSfntSize & 3 ) != 0 ||
153 ( woff.metaOffset == 0 && ( woff.metaLength != 0 ||
154 woff.metaOrigLength != 0 ) ) ||
155 ( woff.metaLength != 0 && woff.metaOrigLength == 0 ) ||
156 ( woff.privOffset == 0 && woff.privLength != 0 ) )
157 {
158 FT_ERROR((
"woff_font_open: invalid WOFF header\n" ));
160 }
161
162
166
168
169
170 {
171 FT_UInt searchRange, entrySelector, rangeShift,
x;
172
173
175 entrySelector = 0;
177 {
179 entrySelector += 1;
180 }
181 entrySelector--;
182
183 searchRange = ( 1 << entrySelector ) * 16;
184 rangeShift = woff.num_tables * 16 - searchRange;
185
191 }
192
193
194
195
196
200
202 " tag offset compLen origLen checksum\n"
203 " -------------------------------------------\n" ));
204
207
208 for ( nn = 0; nn < woff.num_tables; nn++ )
209 {
211
217
218 FT_TRACE2((
" %c%c%c%c %08lx %08lx %08lx %08lx\n",
227
228 if (
table->Tag <= old_tag )
229 {
231
232 FT_ERROR((
"woff_font_open: table tags are not sorted\n" ));
235 }
236
237 old_tag =
table->Tag;
239 }
240
242
243
244
246 woff.num_tables,
249
250
251
252 woff_offset = 44 + woff.num_tables * 20L;
253 sfnt_offset = 12 + woff.num_tables * 16L;
254
255 for ( nn = 0; nn < woff.num_tables; nn++ )
256 {
258
259
260 if (
table->Offset != woff_offset ||
261 table->CompLength > woff.length ||
262 table->Offset > woff.length -
table->CompLength ||
263 table->OrigLength > woff.totalSfntSize ||
264 sfnt_offset > woff.totalSfntSize -
table->OrigLength ||
266 {
267 FT_ERROR((
"woff_font_open: invalid table offsets\n" ));
270 }
271
272 table->OrigOffset = sfnt_offset;
273
274
275 woff_offset += (
table->CompLength + 3 ) & ~3U;
276 sfnt_offset += (
table->OrigLength + 3 ) & ~3U;
277 }
278
279
280
281
282
283
284
285
286
287
288 if ( woff.metaOffset )
289 {
290 if ( woff.metaOffset != woff_offset ||
291 woff.metaOffset + woff.metaLength > woff.length )
292 {
294 " invalid `metadata' offset or length\n" ));
297 }
298
299
300 woff_offset += woff.metaLength;
301 }
302
303 if ( woff.privOffset )
304 {
305
306 woff_offset = ( woff_offset + 3 ) & ~3U;
307
308 if ( woff.privOffset != woff_offset ||
309 woff.privOffset + woff.privLength > woff.length )
310 {
311 FT_ERROR((
"woff_font_open: invalid `private' offset or length\n" ));
314 }
315
316
317 woff_offset += woff.privLength;
318 }
319
320 if ( sfnt_offset != woff.totalSfntSize ||
321 woff_offset != woff.length )
322 {
323 FT_ERROR((
"woff_font_open: invalid `sfnt' table structure\n" ));
326 }
327
328
330 12 + woff.num_tables * 16UL,
331 woff.totalSfntSize ) )
333
334 sfnt_header =
sfnt + 12;
335
336
337
338 for ( nn = 0; nn < woff.num_tables; nn++ )
339 {
341
342
343
348
349
353
355 {
356
360 }
361 else
362 {
363#ifdef FT_CONFIG_OPTION_USE_ZLIB
364
365
367
368
373 goto Exit1;
374 if ( output_len !=
table->OrigLength )
375 {
376 FT_ERROR((
"woff_font_open: compressed table length mismatch\n" ));
378 goto Exit1;
379 }
380
381#else
382
384 goto Exit1;
385
386#endif
387 }
388
390
391
392
393 sfnt_offset =
table->OrigOffset +
table->OrigLength;
394 while ( sfnt_offset & 3 )
395 {
396 sfnt[sfnt_offset] =
'\0';
397 sfnt_offset++;
398 }
399 }
400
401
405
409
410 face->root.stream = sfnt_stream;
411
412 face->root.face_flags &= ~FT_FACE_FLAG_EXTERNAL_STREAM;
413
417
419 {
423 }
424
426
427 Exit1:
430 }
struct nls_table * tables
#define FT_FACE_FLAG_EXTERNAL_STREAM
#define FT_ASSERT(condition)
#define FT_ERROR(varformat)
#define FT_TRACE2(varformat)
FT_Gzip_Uncompress(FT_Memory memory, FT_Byte *output, FT_ULong *output_len, const FT_Byte *input, FT_ULong input_len)
#define FT_REALLOC(ptr, cursz, newsz)
#define FT_NEW_ARRAY(ptr, count)
#define FT_ALLOC(ptr, size)
#define FT_FRAME_ENTER(size)
#define FT_STREAM_SEEK(position)
FT_Stream_Close(FT_Stream stream)
#define FT_FRAME_ULONG(f)
#define FT_STREAM_READ_FIELDS(fields, object)
FT_Stream_Free(FT_Stream stream, FT_Int external)
#define FT_FRAME_START(size)
FT_Stream_OpenMemory(FT_Stream stream, const FT_Byte *base, FT_ULong size)
#define FT_FRAME_USHORT(f)
GLint GLint GLint GLint GLint x
GLuint GLuint GLsizei GLenum const GLvoid * indices
GLenum GLuint GLint GLenum face
GLuint GLsizei GLsizei * length
#define WRITE_ULONG(p, v)
compare_offsets(const void *a, const void *b)
static void sfnt_stream_close(FT_Stream stream)
#define WRITE_USHORT(p, v)
FT_Stream_CloseFunc close
FT_BEGIN_HEADER struct WOFF_HeaderRec_ WOFF_HeaderRec
ActualNumberDriverObjects * sizeof(PDRIVER_OBJECT)) PDRIVER_OBJECT *DriverObjectList