[truetype] Improve handling of stack underflow.

* src/truetype/ttinterp.c (TT_RunIns, Ins_FLIPPT, Ins_DELTAP,
Ins_DELTAC): Exit with error only if `pedantic_hinting' is set.
Otherwise, try to do something sane.
This commit is contained in:
Werner Lemberg 2011-01-31 10:24:32 +01:00
parent 91a97164ca
commit 96f0456483
2 changed files with 44 additions and 13 deletions

View File

@ -1,3 +1,11 @@
2011-01-31 Werner Lemberg <wl@gnu.org>
[truetype] Improve handling of stack underflow.
* src/truetype/ttinterp.c (TT_RunIns, Ins_FLIPPT, Ins_DELTAP,
Ins_DELTAC): Exit with error only if `pedantic_hinting' is set.
Otherwise, try to do something sane.
2011-01-30 Werner Lemberg <wl@gnu.org> 2011-01-30 Werner Lemberg <wl@gnu.org>
* src/sfnt/ttmtx.c (tt_face_load_hmtx): Fix tracing message. * src/sfnt/ttmtx.c (tt_face_load_hmtx): Fix tracing message.

View File

@ -5463,10 +5463,14 @@
if ( CUR.top < CUR.GS.loop ) if ( CUR.top < CUR.GS.loop )
{
if ( CUR.pedantic_hinting )
{ {
CUR.error = TT_Err_Too_Few_Arguments; CUR.error = TT_Err_Too_Few_Arguments;
return; return;
} }
CUR.GS.loop = CUR.top;
}
while ( CUR.GS.loop > 0 ) while ( CUR.GS.loop > 0 )
{ {
@ -6859,8 +6863,9 @@
if ( CUR.args < n ) if ( CUR.args < n )
{ {
if ( CUR.pedantic_hinting )
CUR.error = TT_Err_Too_Few_Arguments; CUR.error = TT_Err_Too_Few_Arguments;
return; n = CUR.args;
} }
CUR.args -= n; CUR.args -= n;
@ -6876,8 +6881,10 @@
{ {
if ( CUR.args < 2 ) if ( CUR.args < 2 )
{ {
if ( CUR.pedantic_hinting )
CUR.error = TT_Err_Too_Few_Arguments; CUR.error = TT_Err_Too_Few_Arguments;
return; CUR.args = 0;
goto Fail;
} }
CUR.args -= 2; CUR.args -= 2;
@ -6926,6 +6933,7 @@
CUR.error = TT_Err_Invalid_Reference; CUR.error = TT_Err_Invalid_Reference;
} }
Fail:
CUR.new_top = CUR.args; CUR.new_top = CUR.args;
} }
@ -6953,8 +6961,9 @@
if ( CUR.args < n ) if ( CUR.args < n )
{ {
if ( CUR.pedantic_hinting )
CUR.error = TT_Err_Too_Few_Arguments; CUR.error = TT_Err_Too_Few_Arguments;
return; n = CUR.args;
} }
CUR.args -= n; CUR.args -= n;
@ -6969,8 +6978,10 @@
{ {
if ( CUR.args < 2 ) if ( CUR.args < 2 )
{ {
if ( CUR.pedantic_hinting )
CUR.error = TT_Err_Too_Few_Arguments; CUR.error = TT_Err_Too_Few_Arguments;
return; CUR.args = 0;
goto Fail;
} }
CUR.args -= 2; CUR.args -= 2;
@ -7018,6 +7029,7 @@
} }
} }
Fail:
CUR.new_top = CUR.args; CUR.new_top = CUR.args;
} }
@ -7478,11 +7490,22 @@
/* `args' is the top of the stack once arguments have been popped. */ /* `args' is the top of the stack once arguments have been popped. */
/* One can also interpret it as the index of the last argument. */ /* One can also interpret it as the index of the last argument. */
if ( CUR.args < 0 ) if ( CUR.args < 0 )
{
FT_UShort i;
if ( CUR.pedantic_hinting )
{ {
CUR.error = TT_Err_Too_Few_Arguments; CUR.error = TT_Err_Too_Few_Arguments;
goto LErrorLabel_; goto LErrorLabel_;
} }
/* push zeroes onto the stack */
for ( i = 0; i < Pop_Push_Count[CUR.opcode] >> 4; i++ )
CUR.stack[i] = 0;
CUR.args = 0;
}
CUR.new_top = CUR.args + ( Pop_Push_Count[CUR.opcode] & 15 ); CUR.new_top = CUR.args + ( Pop_Push_Count[CUR.opcode] & 15 );
/* `new_top' is the new top of the stack, after the instruction's */ /* `new_top' is the new top of the stack, after the instruction's */