summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsuzuki toshiya <sssa@flavor1.ipc.hiroshima-u.ac.jp>2010-07-01 18:39:04 +0900
committersuzuki toshiya <sssa@flavor1.ipc.hiroshima-u.ac.jp>2010-07-01 18:39:04 +0900
commit5ef20c8c1d4de12a84b50ba497c2a358c90ec44b (patch)
tree0dcf573a33c3c113758c74fdfce57d1c9c92e539
parentf29f741efbba0a5ce2f16464f648fb8d026ed4c8 (diff)
downloadfreetype2-5ef20c8c1d4de12a84b50ba497c2a358c90ec44b.tar.gz
Initial fix for Savannah bug #30306.
* src/base/ftobjs.c (Mac_Read_POST_Resource): Check `rlen' the length of fragment declared in the POST fragment header and prevent an underflow in length calculation. Some fonts set the length to zero in spite of the exist of following 16bit `type'. Reported by Robert Swiecki.
-rw-r--r--ChangeLog10
-rw-r--r--src/base/ftobjs.c11
2 files changed, 20 insertions, 1 deletions
diff --git a/ChangeLog b/ChangeLog
index de3c5079e..af91e0038 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,15 @@
2010-07-01 suzuki toshiya <mpsuzuki@hiroshima-u.ac.jp>
+ Initial fix for Savannah bug #30306.
+
+ * src/base/ftobjs.c (Mac_Read_POST_Resource): Check `rlen'
+ the length of fragment declared in the POST fragment header
+ and prevent an underflow in length calculation. Some fonts
+ set the length to zero in spite of the exist of following
+ 16bit `type'. Reported by Robert Swiecki.
+
+2010-07-01 suzuki toshiya <mpsuzuki@hiroshima-u.ac.jp>
+
Additional fix for Savannah bug #30248 and #30249.
* src/base/ftobjs.c (Mac_Read_POST_Resource): Check the buffer
diff --git a/src/base/ftobjs.c b/src/base/ftobjs.c
index 9217b8767..7c2662f6e 100644
--- a/src/base/ftobjs.c
+++ b/src/base/ftobjs.c
@@ -1547,7 +1547,16 @@
goto Exit;
if ( FT_READ_USHORT( flags ) )
goto Exit;
- rlen -= 2; /* the flags are part of the resource */
+ FT_TRACE3(( "POST fragment[%d]: offsets=0x%08x, rlen=0x%08x, flags=0x%04x\n",
+ i, offsets[i], rlen, flags ));
+
+ /* the flags are part of the resource, so rlen >= 2. */
+ /* but some fonts declare rlen = 0 for empty fragment */
+ if ( rlen > 2 )
+ rlen -= 2;
+ else
+ rlen = 0;
+
if ( ( flags >> 8 ) == type )
len += rlen;
else