ref: 0708b23e808eefb16a3a46abd738c040381fa0e3
parent: 76accc184bda4a417001e5fde08dcd670b4a95d5
author: Werner Lemberg <[email protected]>
date: Wed Oct 17 17:38:19 EDT 2012
[psaux] Fix some value overflows. * src/psaux/psconv.c (PS_Conv_ToFixed): Implement it.
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2012-10-17 Werner Lemberg <[email protected]>
+
+ [psaux] Fix some value overflows.
+
+ * src/psaux/psconv.c (PS_Conv_ToFixed): Implement it.
+
2012-10-17 Bram Tassyns <[email protected]>
[cff] Fix value overflow.
--- a/src/psaux/psconv.c
+++ b/src/psaux/psconv.c
@@ -163,7 +163,14 @@
}
if ( *p != '.' )
- integral = PS_Conv_ToInt( &p, limit ) << 16;
+ {
+ integral = PS_Conv_ToInt( &p, limit );
+
+ if ( integral > 0x7FFF )
+ return sign ? -0x7FFFFFFFL : 0x7FFFFFFFL;
+
+ integral <<= 16;
+ }
else
integral = 0;
@@ -210,6 +217,8 @@
while ( power_ten > 0 )
{
+ if ( integral >= 0xCCCCCCCL )
+ return sign ? -0x7FFFFFFFL : 0x7FFFFFFFL;
integral *= 10;
decimal *= 10;
power_ten--;
@@ -223,7 +232,12 @@
}
if ( decimal )
- integral += FT_DivFix( decimal, divider );
+ {
+ decimal = FT_DivFix( decimal, divider );
+ if ( 0x7FFFFFFFL - decimal < integral )
+ return sign ? -0x7FFFFFFFL : 0x7FFFFFFFL;
+ integral += decimal;
+ }
if ( sign )
integral = -integral;