eet: detect overrun and underrun before everything goes wrong.
authorcedric <cedric>
Mon, 16 Jul 2012 10:38:37 +0000 (10:38 +0000)
committercedric <cedric@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Mon, 16 Jul 2012 10:38:37 +0000 (10:38 +0000)
git-svn-id: http://svn.enlightenment.org/svn/e/trunk/eet@73919 7cbeb6ba-43b4-40fd-8cce-4c39aea84d33

ChangeLog
NEWS
src/lib/eet_data.c

index 94a51eb..18d8ff2 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
 2012-06-27  Leandro Santiago
 
        * Fix crash when cyphering huge amount of data.
+
+2012-07-16  Cedric Bail
+
+       * Add code to detect overrun and underrun in eet_data_descriptor_element_add.
diff --git a/NEWS b/NEWS
index 9506fad..6a08a57 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -3,6 +3,9 @@ Eet 1.7.0
 Changes since Eet 1.6.0:
 --------------------------
 
+Additions:
+    * Add code to detect overrun and underrun during Eet Data Descriptor setup.
+
 Fixes:
     * Force destruction of all pending file when shuting down eet.
     * Make eet_dictionary thread safe.
index c5ae621..1eb822a 100644 (file)
@@ -1946,6 +1946,37 @@ eet_data_descriptor_element_add(Eet_Data_Descriptor *edd,
    Eet_Data_Element *ede;
    Eet_Data_Element *tmp;
 
+   /* Sanity check to avoid crash later at runtime */
+   if (type < EET_T_UNKNOW ||
+       type >= EET_T_LAST)
+     {
+        CRIT("Preventing later bug due to unknow type: %i", type);
+        return ;
+     }
+   if (offset < 0)
+     {
+        CRIT("Preventing later buffer underrun : offset = %i", offset);
+        return ;
+     }
+   if (offset > edd->size)
+     {
+        CRIT("Preventing later buffer overrun : offset = %i in a structure of %i bytes", offset, edd->size);
+        return ;
+     }
+   if (group_type == EET_G_UNKNOWN && type != EET_T_UNKNOW)
+     {
+        if (offset + eet_basic_codec[type - 1].size > edd->size)
+          {
+             CRIT("Preventing later buffer overrun : offset = %i, size = %i in a structure of %i bytes", offset, eet_basic_codec[type - 1].size, edd->size);
+             return ;
+          }
+     }
+   else if ((offset + sizeof (void*)) > (unsigned int) edd->size)
+     {
+        CRIT("Preventing later buffer overrun : offset = %i, estimated size = %i in a structure of %i bytes", offset, sizeof (void*), edd->size);
+        return ;
+     }
+
    /* UNION, VARIANT type would not work with simple type, we need a way to map the type. */
    if ((group_type == EET_G_UNION
         || group_type == EET_G_VARIANT)