diff options
author | Kim Woelders <kim@woelders.dk> | 2016-04-14 21:45:06 +0200 |
---|---|---|
committer | Kim Woelders <kim@woelders.dk> | 2016-04-16 17:35:08 +0200 |
commit | a0259d5181b9bd5c2e74077dea4ae36472798a96 (patch) | |
tree | 9fd346793bb7d7e0735ea6e2e40726227b2b4196 | |
parent | 5b549803647b86cea94fd0965e4de354fe933538 (diff) | |
download | imlib2-a0259d5181b9bd5c2e74077dea4ae36472798a96.tar.gz |
Fix various potential OOM crashes.
There were several potential OOM crashes in __imlib_ListFilters(),
__imlib_ListLoaders() and __imlib_TrimLoaderList().
The fix of __imlib_TrimLoaderList() is from patch by
Yuriy M. Kaminskiy <yumkam@gmail.com>.
-rw-r--r-- | src/lib/Makefile.am | 1 | ||||
-rw-r--r-- | src/lib/dynamic_filters.c | 42 | ||||
-rw-r--r-- | src/lib/file.h | 2 | ||||
-rw-r--r-- | src/lib/image.c | 84 | ||||
-rw-r--r-- | src/lib/image.h | 1 | ||||
-rw-r--r-- | src/lib/modules.c | 88 |
6 files changed, 93 insertions, 125 deletions
diff --git a/src/lib/Makefile.am b/src/lib/Makefile.am index 9b330f5..83c734f 100644 --- a/src/lib/Makefile.am +++ b/src/lib/Makefile.am @@ -47,6 +47,7 @@ image.c \ image.h \ line.c \ loaderpath.h \ +modules.c \ polygon.c \ rectangle.c \ rend.c \ diff --git a/src/lib/dynamic_filters.c b/src/lib/dynamic_filters.c index 23a88ec..a650464 100644 --- a/src/lib/dynamic_filters.c +++ b/src/lib/dynamic_filters.c @@ -15,11 +15,8 @@ #include "dynamic_filters.h" #include "file.h" #include "image.h" -#include "loaderpath.h" #include "script.h" -static char **__imlib_ListFilters(int *num_ret); - static ImlibExternalFilter *filters = NULL; static int dyn_initialised = 0; @@ -101,7 +98,7 @@ __imlib_dynamic_filters_init() #ifdef FDEBUG printf("DEBUG: Loading Filters\n"); #endif - list = __imlib_ListFilters(&num_filters); + list = __imlib_ListModules("filters", &num_filters); for (i = num_filters - 1; i >= 0; i--) { tptr = NULL; @@ -150,40 +147,3 @@ __imlib_get_dynamic_filter(char *name) } return NULL; } - -/* loader dir */ -static char ** -__imlib_ListFilters(int *num_ret) -{ - char **list = NULL, **l, *s; - int num, i, pi = 0; - - *num_ret = 0; - /* same for system loader path */ - s = (char *)malloc(sizeof(SYS_LOADERS_PATH) + 8 + 1); - sprintf(s, SYS_LOADERS_PATH "/filters"); - l = __imlib_FileDir(s, &num); - if (num > 0) - { - *num_ret += num; - list = realloc(list, sizeof(char *) * *num_ret); - for (i = 0; i < num; i++) - { - s = (char *)realloc(s, - sizeof(SYS_LOADERS_PATH) + 9 + strlen(l[i]) + - 1); - sprintf(s, SYS_LOADERS_PATH "/filters/%s", l[i]); - list[pi + i] = strdup(s); - } - __imlib_FileFreeDirList(l, num); - } - free(s); - - /* List currently contains *everything in there* we need to weed out - * the .so, .la, .a versions of the same loader or whatever else. - * dlopen can take an extension-less name and do the Right Thing - * with it, so that's what we'll give it. */ - list = __imlib_TrimLoaderList(list, num_ret); - - return list; -} diff --git a/src/lib/file.h b/src/lib/file.h index 4e9a0d1..3bfa52d 100644 --- a/src/lib/file.h +++ b/src/lib/file.h @@ -20,4 +20,6 @@ int __imlib_IsRealFile(const char *s); int __imlib_ItemInList(char **list, int size, char *item); +char **__imlib_ListModules(const char *what, int *num_ret); + #endif diff --git a/src/lib/image.c b/src/lib/image.c index b9fb9d1..850cecc 100644 --- a/src/lib/image.c +++ b/src/lib/image.c @@ -594,88 +594,6 @@ __imlib_ProduceLoader(char *file) return l; } -/* list all the filenames of loaders in the system loaders dir and the user */ -/* loader dir */ -static char ** -__imlib_ListLoaders(int *num_ret) -{ - char **list = NULL, **l, *s; - int num, i, pi = 0; - - *num_ret = 0; - /* same for system loader path */ - s = (char *)malloc(sizeof(SYS_LOADERS_PATH) + 8 + 1); - sprintf(s, SYS_LOADERS_PATH "/loaders"); - l = __imlib_FileDir(s, &num); - if (num > 0) - { - *num_ret += num; - list = realloc(list, sizeof(char *) * *num_ret); - - for (i = 0; i < num; i++) - { - s = (char *)realloc(s, - sizeof(SYS_LOADERS_PATH) + 9 + strlen(l[i]) + - 1); - sprintf(s, SYS_LOADERS_PATH "/loaders/%s", l[i]); - list[pi + i] = strdup(s); - } - __imlib_FileFreeDirList(l, num); - } - free(s); - - /* List currently contains *everything in there* we need to weed out - * the .so, .la, .a versions of the same loader or whatever else. - * dlopen can take an extension-less name and do the Right Thing - * with it, so that's what we'll give it. */ - list = __imlib_TrimLoaderList(list, num_ret); - - return list; -} - -char ** -__imlib_TrimLoaderList(char **list, int *num) -{ - int i, n, size = 0; - - char **ret = NULL; - - if (!list) - return NULL; - if (*num == 0) - return list; - - n = *num; - - for (i = 0; i < n; i++) - { - char *ext; - - if (!list[i]) - continue; - ext = strrchr(list[i], '.'); - if ((ext) && ( -#ifdef __CYGWIN__ - (!strcasecmp(ext, ".dll")) || -#endif - (!strcasecmp(ext, ".so")))) - { - /* Don't add the same loader multiple times... */ - if (!__imlib_ItemInList(ret, size, list[i])) - { - ret = realloc(ret, sizeof(char *) * (size + 1)); - - ret[size++] = strdup(list[i]); - } - } - if (list[i]) - free(list[i]); - } - free(list); - *num = size; - return ret; -} - /* fre the struct for a loader and close its dlopen'd handle */ static void __imlib_ConsumeLoader(ImlibLoader * l) @@ -753,7 +671,7 @@ __imlib_LoadAllLoaders(void) char **list; /* list all the loaders imlib can find */ - list = __imlib_ListLoaders(&num); + list = __imlib_ListModules("loaders", &num); /* no loaders? well don't load anything */ if (!list) return; diff --git a/src/lib/image.h b/src/lib/image.h index 42bea83..8f8146a 100644 --- a/src/lib/image.h +++ b/src/lib/image.h @@ -135,7 +135,6 @@ void __imlib_AddImagePixmapToCache(ImlibImagePixmap * ip); void __imlib_RemoveImagePixmapFromCache(ImlibImagePixmap * ip); void __imlib_CleanupImagePixmapCache(void); #endif -char **__imlib_TrimLoaderList(char **list, int *num); void __imlib_RemoveAllLoaders(void); ImlibLoader *__imlib_FindBestLoaderForFile(const char *file, int for_save); diff --git a/src/lib/modules.c b/src/lib/modules.c new file mode 100644 index 0000000..69814eb --- /dev/null +++ b/src/lib/modules.c @@ -0,0 +1,88 @@ +#include "config.h" + +#include <stdlib.h> + +#include "file.h" +#include "image.h" +#include "loaderpath.h" + +static char ** +__imlib_TrimLoaderList(char **list, int *num) +{ + int i, n, size = 0; + + if (!list) + return NULL; + + n = *num; + + for (i = 0; i < n; i++) + { + char *ext; + + if (!list[i]) + continue; + ext = strrchr(list[i], '.'); + if ((ext) && ( +#ifdef __CYGWIN__ + (!strcasecmp(ext, ".dll")) || +#endif + (!strcasecmp(ext, ".so")))) + { + /* Don't add the same loader multiple times... */ + if (!__imlib_ItemInList(list, size, list[i])) + { + list[size++] = list[i]; + continue; + } + } + free(list[i]); + } + if (!size) + { + free(list); + list = NULL; + } + else + { + list = realloc(list, size * sizeof(char *)); + } + *num = size; + return list; +} + +char ** +__imlib_ListModules(const char *what, int *num_ret) +{ + char **list = NULL, **l; + char path[1024]; + int num, i; + + *num_ret = 0; + + snprintf(path, sizeof(path), "%s/%s", SYS_LOADERS_PATH, what); + l = __imlib_FileDir(path, &num); + if (num <= 0) + return NULL; + + list = malloc(num * sizeof(char *)); + if (list) + { + for (i = 0; i < num; i++) + { + snprintf(path, sizeof(path), "%s/%s/%s", + SYS_LOADERS_PATH, what, l[i]); + list[i] = strdup(path); + } + *num_ret = num; + } + __imlib_FileFreeDirList(l, num); + + /* List currently contains *everything in there* we need to weed out + * the .so, .la, .a versions of the same loader or whatever else. + * dlopen can take an extension-less name and do the Right Thing + * with it, so that's what we'll give it. */ + list = __imlib_TrimLoaderList(list, num_ret); + + return list; +} |