X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;f=gtk%2Fgtkiconcachevalidator.c;h=a4e6947826560d7af9e3f64d06b8e3fe2c408133;hb=32aa7f0582febb614c41e4130ad34ac44ef6efd2;hp=21c4ec205995729a5decadef400bcc958ffe6e47;hpb=fdd5aa6e5b6dec73d97b902ab3f4f2add52c82e4;p=~andy%2Fgtk
diff --git a/gtk/gtkiconcachevalidator.c b/gtk/gtkiconcachevalidator.c
index 21c4ec205..a4e694782 100644
--- a/gtk/gtkiconcachevalidator.c
+++ b/gtk/gtkiconcachevalidator.c
@@ -12,9 +12,7 @@
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
+ * License along with this library. If not, see .
*/
#include "config.h"
#include "gtkiconcachevalidator.h"
@@ -23,7 +21,7 @@
#include
-#define VERBOSE(x) x
+#define VERBOSE(x)
#define check(name,condition) \
if (!(condition)) \
@@ -103,6 +101,32 @@ check_string (CacheInfo *info,
return TRUE;
}
+static gboolean
+check_string_utf8 (CacheInfo *info,
+ guint32 offset)
+{
+ check ("string offset", offset < info->cache_size);
+
+ if (info->flags & CHECK_STRINGS)
+ {
+ gint i;
+ gchar c;
+
+ /* assume no string is longer than 1k */
+ for (i = 0; i < 1024; i++)
+ {
+ check ("string offset", offset + i < info->cache_size)
+ c = *(info->cache + offset + i);
+ if (c == '\0')
+ break;
+ }
+ check ("string length", i < 1024);
+ check ("string utf8 data", g_utf8_validate((char *)(info->cache + offset), -1, NULL));
+ }
+
+ return TRUE;
+}
+
static gboolean
check_directory_list (CacheInfo *info,
guint32 offset)
@@ -140,7 +164,7 @@ check_pixel_data (CacheInfo *info,
GdkPixdata data;
check ("pixel data", gdk_pixdata_deserialize (&data, length,
- info->cache + offset + 8,
+ (const guint8*)info->cache + offset + 8,
NULL));
}
@@ -172,16 +196,18 @@ static gboolean
check_display_name_list (CacheInfo *info,
guint32 offset)
{
- guint32 n_display_names;
+ guint32 n_display_names, ofs;
gint i;
check ("offset, display name list",
get_uint32 (info, offset, &n_display_names));
for (i = 0; i < n_display_names; i++)
{
- if (!check_string (info, offset + 4 + 8 * i))
+ get_uint32(info, offset + 4 + 8 * i, &ofs);
+ if (!check_string (info, ofs))
return FALSE;
- if (!check_string (info, offset + 4 + 8 * i + 4))
+ get_uint32(info, offset + 4 + 8 * i + 4, &ofs);
+ if (!check_string_utf8 (info, ofs))
return FALSE;
}