ref: cad797e6f13ba4c2e8dab8752969e87101f89090
parent: 60ee2812b1709d8726977b9f158fc928eab4dfdc
author: Tom Kacvinsky <[email protected]>
date: Tue Apr 10 14:15:17 EDT 2001
In function parse_charstrings, changed code for placing .notdef glyph into slot 0 so that we no longer have a memory access violation.
--- a/src/type1/t1load.c
+++ b/src/type1/t1load.c
@@ -1044,7 +1044,7 @@
len = (FT_Int)( cur2 - cur - 1 );
parser->root.error = T1_Add_Table( char_table, charcode,
- cur + 1, len + 1 );
+ cur + 1, len + 1 );
char_table->elements[charcode][len] = '\0';
if ( parser->root.error )
return;
@@ -1172,6 +1172,7 @@
T1_ParserRec* parser = &loader->parser;
PS_Table* code_table = &loader->charstrings;
PS_Table* name_table = &loader->glyph_names;
+ PS_Table* swap_table = &loader->swap_table;
FT_Memory memory = parser->root.memory;
FT_Error error;
@@ -1192,7 +1193,9 @@
if ( parser->root.error )
return;
- /* initialize tables, adding space for `swap' at table end */
+ /* initialize tables (leaving room for addition of .notdef, */
+ /* if necessary). */
+
error = psaux->ps_table_funcs->init( code_table,
loader->num_glyphs + 1,
memory );
@@ -1205,6 +1208,15 @@
if ( error )
goto Fail;
+ /* Initialize table for swapping index notdef_index and */
+ /* index 0 names and codes (if necessary). */
+
+ error = psaux->ps_table_funcs->init( swap_table, 4, memory );
+
+ if ( error )
+ goto Fail;
+
+
n = 0;
for (;;)
{
@@ -1292,29 +1304,34 @@
notdef_found )
{
- /* Swap glyph in index 0 with /.notdef glyph. First, add index 0 */
- /* name/code to end of table. Then place notdef_index name/code into */
- /* index 0. Then take end of table name/code and place it into index */
- /* notdef_index. */
+ /* Swap glyph in index 0 with /.notdef glyph. First, add index 0 name and */
+ /* code entires to swap_table. Then place notdef_index name and code entires */
+ /* into swap_table. Then swap name and code entries at indices notdef_index */
+ /* and 0 using values stored in swap_table. */
- error = T1_Add_Table( name_table, n,
+ /* Index 0 name */
+ error = T1_Add_Table( swap_table, 0,
name_table->elements[0],
name_table->lengths [0] );
if ( error )
goto Fail;
- error = T1_Add_Table( code_table, n,
+
+ /* Index 0 code */
+ error = T1_Add_Table( swap_table, 1,
code_table->elements[0],
code_table->lengths [0] );
if ( error )
goto Fail;
- error = T1_Add_Table( name_table, 0,
+ /* Index notdef_index name */
+ error = T1_Add_Table( swap_table, 2,
name_table->elements[notdef_index],
name_table->lengths [notdef_index] );
if ( error )
goto Fail;
- error = T1_Add_Table( code_table, 0,
+ /* Index notdef_index code */
+ error = T1_Add_Table( swap_table, 3,
code_table->elements[notdef_index],
code_table->lengths [notdef_index] );
if ( error )
@@ -1321,17 +1338,29 @@
goto Fail;
error = T1_Add_Table( name_table, notdef_index,
- name_table->elements[n],
- name_table->lengths [n] );
+ swap_table->elements[0],
+ swap_table->lengths [0] );
if ( error )
goto Fail;
error = T1_Add_Table( code_table, notdef_index,
- code_table->elements[n],
- code_table->lengths [n] );
+ swap_table->elements[1],
+ swap_table->lengths [1] );
if ( error )
goto Fail;
+ error = T1_Add_Table( name_table, 0,
+ swap_table->elements[2],
+ swap_table->lengths [2] );
+ if ( error )
+ goto Fail;
+
+ error = T1_Add_Table( code_table, 0,
+ swap_table->elements[3],
+ swap_table->lengths [3] );
+ if ( error )
+ goto Fail;
+
}
else if ( !notdef_found )
{
@@ -1338,7 +1367,7 @@
/* notdef_index is already 0, or /.notdef is undefined in */
/* charstrings dictionary. Worry about /.notdef undefined. */
- /* we take index 0 and add it to the end of the table(s) */
+ /* We take index 0 and add it to the end of the table(s) */
/* and add our own /.notdef glyph to index 0. */
/* 0 333 hsbw endchar */
@@ -1346,13 +1375,13 @@
char* notdef_name = (char *)".notdef";
- error = T1_Add_Table( name_table, n,
+ error = T1_Add_Table( swap_table, 0,
name_table->elements[0],
name_table->lengths [0] );
if ( error )
goto Fail;
- error = T1_Add_Table( code_table, n,
+ error = T1_Add_Table( swap_table, 1,
code_table->elements[0],
code_table->lengths [0] );
if ( error )
@@ -1367,11 +1396,24 @@
if ( error )
goto Fail;
+ error = T1_Add_Table( name_table, n,
+ swap_table->elements[0],
+ swap_table->lengths [0] );
+ if ( error )
+ goto Fail;
+
+ error = T1_Add_Table( code_table, n,
+ swap_table->elements[1],
+ swap_table->lengths [1] );
+ if ( error )
+ goto Fail;
+
/* we added a glyph. */
loader->num_glyphs = n + 1;
}
+
return;
Fail:
@@ -1537,6 +1579,7 @@
loader->charstrings.init = 0;
loader->glyph_names.init = 0;
loader->subrs.init = 0;
+ loader->swap_table.init = 0;
loader->fontdata = 0;
}
@@ -1551,6 +1594,7 @@
T1_Release_Table( &loader->encoding_table );
T1_Release_Table( &loader->charstrings );
T1_Release_Table( &loader->glyph_names );
+ T1_Release_Table( &loader->swap_table );
T1_Release_Table( &loader->subrs );
/* finalize parser */