From 41ee5267cbaddb90070af789cdd52a912a9762c7 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Fri, 14 Nov 2003 23:28:01 +0000 Subject: [PATCH] Check that the mask is NULL or a string of the same length consisting Sat Nov 15 00:26:19 2003 Matthias Clasen * queryloaders.c (loader_sanity_check): Check that the mask is NULL or a string of the same length consisting entirely of ' ', '!', 'x', 'z', 'n'. --- docs/reference/ChangeLog | 5 ++++ .../gdk-pixbuf/tmpl/module_interface.sgml | 24 ++++++++++++++----- gdk-pixbuf/ChangeLog | 6 +++++ gdk-pixbuf/queryloaders.c | 23 ++++++++++++++++-- 4 files changed, 50 insertions(+), 8 deletions(-) diff --git a/docs/reference/ChangeLog b/docs/reference/ChangeLog index 95fa449a0e..f9e1a31d26 100644 --- a/docs/reference/ChangeLog +++ b/docs/reference/ChangeLog @@ -1,3 +1,8 @@ +Sat Nov 15 00:25:39 2003 Matthias Clasen + + * gdk-pixbuf/tmpl/module_interface.sgml: Add an example + for GdkPixbufModulePattern. + Wed Nov 12 21:52:35 2003 Matthias Clasen * gtk/gtk-sections.txt: Add gtk_menu_set_monitor. diff --git a/docs/reference/gdk-pixbuf/tmpl/module_interface.sgml b/docs/reference/gdk-pixbuf/tmpl/module_interface.sgml index 9bacd0e492..c3c86af969 100644 --- a/docs/reference/gdk-pixbuf/tmpl/module_interface.sgml +++ b/docs/reference/gdk-pixbuf/tmpl/module_interface.sgml @@ -18,8 +18,8 @@ a #GdkPixbufModuleFillVtableFunc function named In order to make format-checking work before actually loading the modules (which may require dlopening image libraries), modules export their signatures (and other information) via the fill_info -function. An external utility, gdk-pixbuf-query-loaders, uses -this to create a text file containing a list of all available loaders and +function. An external utility, gdk-pixbuf-query-loaders, +uses this to create a text file containing a list of all available loaders and their signatures. This file is then read at runtime by &gdk-pixbuf; to obtain the list of available loaders and their signatures. @@ -158,18 +158,30 @@ operations. The signature of a module is a set of prefixes. Prefixes are encoded as -pairs of ordinary strings, where the second string, if not %NULL, -may contain ' ', '!', 'x', 'z', and 'n' to indicate bytes that must be -matched, not matched, "don't-care"-bytes, zeros and non-zeros. +pairs of ordinary strings, where the second string, if not %NULL, must be +of the same length as the first one and may contain ' ', '!', 'x', 'z', +and 'n' to indicate bytes that must be matched, not matched, +"don't-care"-bytes, zeros and non-zeros. Each prefix has an associated integer that describes the relevance of the prefix, with 0 meaning a mismatch and 100 a "perfect match". The signature of a module is stored as an array of -#GdkPixbufModulePatterns. +#GdkPixbufModulePatterns. The array is terminated by a pattern +where the @prefix is %NULL. + +GdkPixbufModulePattern *signature[] = { + { "abcdx", " !x z", 100 }, + { "bla", NULL, 90 }, + { NULL, NULL, 0 } +}; + +The example matches e.g. "auud\0" with relevance 100, and "blau" with +relevance 90. + @prefix: the prefix for this pattern @mask: mask containing bytes which modify how the prefix is matched against test data diff --git a/gdk-pixbuf/ChangeLog b/gdk-pixbuf/ChangeLog index be50ab86c0..e1286f7441 100644 --- a/gdk-pixbuf/ChangeLog +++ b/gdk-pixbuf/ChangeLog @@ -1,3 +1,9 @@ +Sat Nov 15 00:26:19 2003 Matthias Clasen + + * queryloaders.c (loader_sanity_check): Check that the mask + is NULL or a string of the same length consisting entirely of + ' ', '!', 'x', 'z', 'n'. + Mon Nov 10 00:17:52 2003 Matthias Clasen * Makefile.am (install-data-local): Typo fix in warning. diff --git a/gdk-pixbuf/queryloaders.c b/gdk-pixbuf/queryloaders.c index 0e1502a443..41c4c3669d 100644 --- a/gdk-pixbuf/queryloaders.c +++ b/gdk-pixbuf/queryloaders.c @@ -59,13 +59,32 @@ loader_sanity_check (const char *path, GdkPixbufFormat *info, GdkPixbufModule *v const GdkPixbufModulePattern *pattern; const char *error = ""; - for (pattern = info->signature; pattern->prefix; pattern++) - if (strlen (pattern->prefix) == 0) + for (pattern = info->signature; pattern->prefix; pattern++) + { + int prefix_len = strlen (pattern->prefix); + if (prefix_len == 0) { error = "empty pattern"; goto error; } + if (pattern->mask) + { + int mask_len = strlen (pattern->mask); + if (mask_len != prefix_len) + { + error = "mask length mismatch"; + + goto error; + } + if (strspn (pattern->mask, " !xzn") < mask_len) + { + error = "bad char in mask"; + + goto error; + } + } + } if (!vtable->load && !vtable->begin_load && !vtable->load_animation) {