summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexei Podtelezhnikov <apodtele@gmail.com>2023-03-29 00:21:00 -0400
committerAlexei Podtelezhnikov <apodtele@gmail.com>2023-03-29 00:21:00 -0400
commit4679fcb666494d200097845b4bd409fafe7eba5a (patch)
treec5fd40421496e5531283a3f8c8c71ab1c187e6d7
parent4d8db130ea4342317581bab65fc96365ce806b77 (diff)
downloadfreetype2-4679fcb666494d200097845b4bd409fafe7eba5a.tar.gz
[sfnt] Streamline POST format 2.0 handing (cont'd).
* src/sfnt/ttpost.c (load_format_20): Co-allocate the string data and their pointers, which makes it easier to handle and free them. (tt_face_free_ps_names): Updated. * include/freetype/internal/tttypes.h (TT_Post_20): Update type.
-rw-r--r--include/freetype/internal/tttypes.h2
-rw-r--r--src/sfnt/ttpost.c36
2 files changed, 13 insertions, 25 deletions
diff --git a/include/freetype/internal/tttypes.h b/include/freetype/internal/tttypes.h
index 3b521924c..fee036bb8 100644
--- a/include/freetype/internal/tttypes.h
+++ b/include/freetype/internal/tttypes.h
@@ -803,7 +803,7 @@ FT_BEGIN_HEADER
FT_UShort num_glyphs;
FT_UShort num_names;
FT_UShort* glyph_indices;
- FT_Char** glyph_names;
+ FT_Byte** glyph_names;
} TT_Post_20Rec, *TT_Post_20;
diff --git a/src/sfnt/ttpost.c b/src/sfnt/ttpost.c
index d3ec757ee..81992b3fb 100644
--- a/src/sfnt/ttpost.c
+++ b/src/sfnt/ttpost.c
@@ -167,8 +167,7 @@
FT_UShort num_names;
FT_UShort* glyph_indices = NULL;
- FT_Char** name_strings = NULL;
- FT_Byte* strings = NULL;
+ FT_Byte** name_strings = NULL;
if ( FT_READ_USHORT( num_glyphs ) )
@@ -229,13 +228,17 @@
{
FT_UShort n;
FT_ULong p;
+ FT_Byte* strings;
post_len -= (FT_ULong)num_glyphs * 2UL + 2;
- if ( FT_QALLOC( strings, post_len + 1 ) ||
- FT_STREAM_READ( strings, post_len ) ||
- FT_QNEW_ARRAY( name_strings, num_names ) )
+ if ( FT_QALLOC( name_strings, num_names * sizeof ( FT_Byte* ) +
+ post_len + 1 ) )
+ goto Fail;
+
+ strings = (FT_Byte*)( name_strings + num_names );
+ if ( FT_STREAM_READ( strings, post_len ) )
goto Fail;
/* convert from Pascal- to C-strings and set pointers */
@@ -251,7 +254,7 @@
}
strings[p] = 0;
- name_strings[n] = (FT_Char*)strings + p + 1;
+ name_strings[n] = strings + p + 1;
p += len + 1;
}
strings[post_len] = 0;
@@ -259,22 +262,11 @@
/* deal with missing or insufficient string data */
if ( n < num_names )
{
- if ( post_len == 0 )
- {
- /* fake empty string */
- if ( FT_QREALLOC( strings, 1, 2 ) )
- goto Fail;
+ FT_TRACE4(( "load_format_20: %hu PostScript names are truncated\n",
+ num_names - n ));
- post_len = 1;
- strings[post_len] = 0;
- }
-
- FT_ERROR(( "load_format_20:"
- " all entries in post table are already parsed,"
- " using NULL names for gid %d - %d\n",
- n, num_names - 1 ));
for ( ; n < num_names; n++ )
- name_strings[n] = (FT_Char*)strings + post_len;
+ name_strings[n] = strings + post_len;
}
}
@@ -292,7 +284,6 @@
Fail:
FT_FREE( name_strings );
- FT_FREE( strings );
FT_FREE( glyph_indices );
Exit:
@@ -427,9 +418,6 @@
if ( table->num_names )
{
- table->glyph_names[0]--;
- FT_FREE( table->glyph_names[0] );
-
FT_FREE( table->glyph_names );
table->num_names = 0;
}