Commit 3645982ac26c7a99bf77a3af2bf7eb6a3f871334

Werner Lemberg 2017-09-22T07:53:25

[otvalid] Macros for 32bit offset support. * src/otvalid/otvcommn.h (OTV_OPTIONAL_TABLE32, OTV_OPTIONAL_OFFSET32, OTV_SIZE_CHECK32): New macros.

diff --git a/ChangeLog b/ChangeLog
index 87af87c..b6ea66d 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2017-09-22  Werner Lemberg  <wl@gnu.org>
+
+	[otvalid] Macros for 32bit offset support.
+
+	* src/otvalid/otvcommn.h (OTV_OPTIONAL_TABLE32,
+	OTV_OPTIONAL_OFFSET32, OTV_SIZE_CHECK32): New macros.
+
 2017-09-21  Alexei Podtelezhnikov  <apodtele@gmail.com>
 
 	[build] Simplify Visual C++ 2010 project.
diff --git a/src/otvalid/otvcommn.h b/src/otvalid/otvcommn.h
index 5a94005..40a7985 100644
--- a/src/otvalid/otvcommn.h
+++ b/src/otvalid/otvcommn.h
@@ -73,12 +73,21 @@ FT_BEGIN_HEADER
 #define OTV_OPTIONAL_TABLE( _table )  FT_UShort  _table;      \
                                       FT_Bytes   _table ## _p
 
+#define OTV_OPTIONAL_TABLE32( _table )  FT_ULong  _table;       \
+                                        FT_Bytes   _table ## _p
+
 #define OTV_OPTIONAL_OFFSET( _offset )           \
           FT_BEGIN_STMNT                         \
             _offset ## _p = p;                   \
             _offset       = FT_NEXT_USHORT( p ); \
           FT_END_STMNT
 
+#define OTV_OPTIONAL_OFFSET32( _offset )        \
+          FT_BEGIN_STMNT                        \
+            _offset ## _p = p;                  \
+            _offset       = FT_NEXT_ULONG( p ); \
+          FT_END_STMNT
+
 #define OTV_LIMIT_CHECK( _count )                      \
           FT_BEGIN_STMNT                               \
             if ( p + (_count) > otvalid->root->limit ) \
@@ -102,12 +111,33 @@ FT_BEGIN_HEADER
                             " set to zero.\n"                       \
                             "\n", #_size ));                        \
                                                                     \
-                /* always assume 16bit entities */                  \
                 _size = pp[0] = pp[1] = 0;                          \
               }                                                     \
             }                                                       \
           FT_END_STMNT
 
+#define OTV_SIZE_CHECK32( _size )                                   \
+          FT_BEGIN_STMNT                                            \
+            if ( _size > 0 && _size < table_size )                  \
+            {                                                       \
+              if ( otvalid->root->level == FT_VALIDATE_PARANOID )   \
+                FT_INVALID_OFFSET;                                  \
+              else                                                  \
+              {                                                     \
+                /* strip off `const' */                             \
+                FT_Byte*  pp = (FT_Byte*)_size ## _p;               \
+                                                                    \
+                                                                    \
+                FT_TRACE3(( "\n"                                    \
+                            "Invalid offset to optional table `%s'" \
+                            " set to zero.\n"                       \
+                            "\n", #_size ));                        \
+                                                                    \
+                _size = pp[0] = pp[1] = pp[2] = pp[3] = 0;          \
+              }                                                     \
+            }                                                       \
+          FT_END_STMNT
+
 
 #define  OTV_NAME_(x)  #x
 #define  OTV_NAME(x)   OTV_NAME_(x)