[woff, woff2] Avoid buffer zeroing.

* src/sfnt/sfwoff.c (woff_open_font): Use Q-macros.
* src/sfnt/sfwoff2.c: Ditto.
(reconstruct_font): Allocate table_entry on stack.
This commit is contained in:
Alexei Podtelezhnikov 2022-06-11 16:10:40 -04:00
parent 4fef1fcede
commit 73631b9530
2 changed files with 35 additions and 41 deletions

View File

@ -196,8 +196,8 @@
/* tag value, the tables themselves are not. We thus have to */
/* sort them by offset and check that they don't overlap. */
if ( FT_NEW_ARRAY( tables, woff.num_tables ) ||
FT_NEW_ARRAY( indices, woff.num_tables ) )
if ( FT_QNEW_ARRAY( tables, woff.num_tables ) ||
FT_QNEW_ARRAY( indices, woff.num_tables ) )
goto Exit;
FT_TRACE2(( "\n" ));
@ -328,9 +328,9 @@
}
/* Now use `totalSfntSize'. */
if ( FT_REALLOC( sfnt,
12 + woff.num_tables * 16UL,
woff.totalSfntSize ) )
if ( FT_QREALLOC( sfnt,
12 + woff.num_tables * 16UL,
woff.totalSfntSize ) )
goto Exit;
sfnt_header = sfnt + 12;

View File

@ -229,9 +229,9 @@
{
FT_TRACE6(( "Reallocating %lu to %lu.\n",
*dst_size, (*offset + size) ));
if ( FT_REALLOC( dst,
(FT_ULong)( *dst_size ),
(FT_ULong)( *offset + size ) ) )
if ( FT_QREALLOC( dst,
(FT_ULong)( *dst_size ),
(FT_ULong)( *offset + size ) ) )
goto Exit;
*dst_size = *offset + size;
@ -784,7 +784,7 @@
goto Fail;
loca_buf_size = loca_values_size * offset_size;
if ( FT_QNEW_ARRAY( loca_buf, loca_buf_size ) )
if ( FT_QALLOC( loca_buf, loca_buf_size ) )
goto Fail;
dst = loca_buf;
@ -863,7 +863,7 @@
WOFF2_Point points = NULL;
if ( FT_NEW_ARRAY( substreams, num_substreams ) )
if ( FT_QNEW_ARRAY( substreams, num_substreams ) )
goto Fail;
if ( FT_STREAM_SKIP( 2 ) )
@ -926,7 +926,7 @@
offset += overlap_bitmap_length;
}
if ( FT_NEW_ARRAY( loca_values, num_glyphs + 1 ) )
if ( FT_QNEW_ARRAY( loca_values, num_glyphs + 1 ) )
goto Fail;
points_size = 0;
@ -938,10 +938,10 @@
substreams[BBOX_STREAM].offset += bbox_bitmap_length;
glyph_buf_size = WOFF2_DEFAULT_GLYPH_BUF;
if ( FT_NEW_ARRAY( glyph_buf, glyph_buf_size ) )
if ( FT_QALLOC( glyph_buf, glyph_buf_size ) )
goto Fail;
if ( FT_NEW_ARRAY( info->x_mins, num_glyphs ) )
if ( FT_QNEW_ARRAY( info->x_mins, num_glyphs ) )
goto Fail;
for ( i = 0; i < num_glyphs; ++i )
@ -999,7 +999,7 @@
size_needed = 12 + composite_size + instruction_size;
if ( glyph_buf_size < size_needed )
{
if ( FT_RENEW_ARRAY( glyph_buf, glyph_buf_size, size_needed ) )
if ( FT_QREALLOC( glyph_buf, glyph_buf_size, size_needed ) )
goto Fail;
glyph_buf_size = size_needed;
}
@ -1075,7 +1075,7 @@
have_overlap = TRUE;
}
if ( FT_NEW_ARRAY( n_points_arr, n_contours ) )
if ( FT_QNEW_ARRAY( n_points_arr, n_contours ) )
goto Fail;
if ( FT_STREAM_SEEK( substreams[N_POINTS_STREAM].offset ) )
@ -1112,7 +1112,7 @@
/* Create array to store point information. */
points_size = total_n_points;
if ( FT_NEW_ARRAY( points, points_size ) )
if ( FT_QNEW_ARRAY( points, points_size ) )
goto Fail;
if ( triplet_decode( flags_buf,
@ -1141,7 +1141,7 @@
instruction_size;
if ( glyph_buf_size < size_needed )
{
if ( FT_RENEW_ARRAY( glyph_buf, glyph_buf_size, size_needed ) )
if ( FT_QREALLOC( glyph_buf, glyph_buf_size, size_needed ) )
goto Fail;
glyph_buf_size = size_needed;
}
@ -1226,8 +1226,7 @@
*glyf_checksum += compute_ULong_sum( glyph_buf, glyph_size );
/* Store x_mins, may be required to reconstruct `hmtx'. */
if ( n_contours > 0 )
info->x_mins[i] = (FT_Short)x_min;
info->x_mins[i] = (FT_Short)x_min;
}
info->glyf_table->dst_length = dest_offset - info->glyf_table->dst_offset;
@ -1344,7 +1343,7 @@
offset_size = index_format ? 4 : 2;
/* Create `x_mins' array. */
if ( FT_NEW_ARRAY( info->x_mins, num_glyphs ) )
if ( FT_QNEW_ARRAY( info->x_mins, num_glyphs ) )
return error;
loca_offset = info->loca_table->src_offset;
@ -1432,8 +1431,8 @@
if ( num_hmetrics < 1 )
goto Fail;
if ( FT_NEW_ARRAY( advance_widths, num_hmetrics ) ||
FT_NEW_ARRAY( lsbs, num_glyphs ) )
if ( FT_QNEW_ARRAY( advance_widths, num_hmetrics ) ||
FT_QNEW_ARRAY( lsbs, num_glyphs ) )
goto Fail;
/* Read `advanceWidth' stream. Always present. */
@ -1484,7 +1483,7 @@
/* Build the hmtx table. */
hmtx_table_size = 2 * num_hmetrics + 2 * num_glyphs;
if ( FT_NEW_ARRAY( hmtx_table, hmtx_table_size ) )
if ( FT_QALLOC( hmtx_table, hmtx_table_size ) )
goto Fail;
dst = hmtx_table;
@ -1541,10 +1540,10 @@
{
/* Memory management of `transformed_buf' is handled by the caller. */
FT_Error error = FT_Err_Ok;
FT_Stream stream = NULL;
FT_Byte* buf_cursor = NULL;
FT_Byte* table_entry = NULL;
FT_Error error = FT_Err_Ok;
FT_Stream stream = NULL;
FT_Byte* buf_cursor = NULL;
FT_Byte table_entry[16];
/* We are reallocating memory for `sfnt', so its pointer may change. */
FT_Byte* sfnt = *sfnt_bytes;
@ -1585,10 +1584,6 @@
}
}
/* Create buffer for table entries. */
if ( FT_NEW_ARRAY( table_entry, 16 ) )
goto Fail;
/* Create a stream for the uncompressed buffer. */
if ( FT_NEW( stream ) )
goto Fail;
@ -1751,7 +1746,6 @@
/* Set pointer of sfnt stream to its correct value. */
*sfnt_bytes = sfnt;
FT_FREE( table_entry );
FT_Stream_Close( stream );
FT_FREE( stream );
@ -1764,7 +1758,6 @@
/* Set pointer of sfnt stream to its correct value. */
*sfnt_bytes = sfnt;
FT_FREE( table_entry );
FT_Stream_Close( stream );
FT_FREE( stream );
@ -1877,8 +1870,8 @@
woff2.ttc_fonts = NULL;
/* Read table directory. */
if ( FT_NEW_ARRAY( tables, woff2.num_tables ) ||
FT_NEW_ARRAY( indices, woff2.num_tables ) )
if ( FT_QNEW_ARRAY( tables, woff2.num_tables ) ||
FT_QNEW_ARRAY( indices, woff2.num_tables ) )
goto Exit;
FT_TRACE2(( "\n" ));
@ -1949,10 +1942,11 @@
goto Exit;
}
table->flags = flags;
table->src_offset = src_offset;
table->src_length = table->TransformLength;
src_offset += table->TransformLength;
table->flags = flags;
table->dst_offset = 0;
FT_TRACE2(( " %c%c%c%c %08d %08d %08ld %08ld %08ld\n",
(FT_Char)( table->Tag >> 24 ),
@ -2010,7 +2004,7 @@
FT_TRACE4(( "Number of fonts in TTC: %d\n", woff2.num_fonts ));
if ( FT_NEW_ARRAY( woff2.ttc_fonts, woff2.num_fonts ) )
if ( FT_QNEW_ARRAY( woff2.ttc_fonts, woff2.num_fonts ) )
goto Exit;
for ( nn = 0; nn < woff2.num_fonts; nn++ )
@ -2023,7 +2017,7 @@
if ( FT_READ_ULONG( ttc_font->flavor ) )
goto Exit;
if ( FT_NEW_ARRAY( ttc_font->table_indices, ttc_font->num_tables ) )
if ( FT_QNEW_ARRAY( ttc_font->table_indices, ttc_font->num_tables ) )
goto Exit;
FT_TRACE5(( "Number of tables in font %d: %d\n",
@ -2302,9 +2296,9 @@
{
FT_TRACE5(( "Trimming sfnt stream from %lu to %lu.\n",
sfnt_size, woff2.actual_sfnt_size ));
if ( FT_REALLOC( sfnt,
(FT_ULong)( sfnt_size ),
(FT_ULong)( woff2.actual_sfnt_size ) ) )
if ( FT_QREALLOC( sfnt,
(FT_ULong)( sfnt_size ),
(FT_ULong)( woff2.actual_sfnt_size ) ) )
goto Exit;
}