diff options
author | Kim Woelders <kim@woelders.dk> | 2019-10-15 20:08:43 +0200 |
---|---|---|
committer | Kim Woelders <kim@woelders.dk> | 2019-10-15 20:39:44 +0200 |
commit | 5e267577bdaa6ce5bb9e5fc238d7a58408f2fd27 (patch) | |
tree | 01d565298e26e06ad035f2fff1fae0741da32eef | |
parent | ff3164df37947bb7ba1e5445a76545ccaf22d8e6 (diff) | |
download | imlib2-5e267577bdaa6ce5bb9e5fc238d7a58408f2fd27.tar.gz |
GZIP loader: Check filename before uncompress
Inspired by corresponding bz2 loader fix.
Also remove pointless call to stat().
-rw-r--r-- | src/modules/loaders/loader_zlib.c | 23 |
1 files changed, 11 insertions, 12 deletions
diff --git a/src/modules/loaders/loader_zlib.c b/src/modules/loaders/loader_zlib.c index 29c39a0..aba9583 100644 --- a/src/modules/loaders/loader_zlib.c +++ b/src/modules/loaders/loader_zlib.c @@ -42,10 +42,10 @@ load(ImlibImage * im, ImlibProgressFunction progress, char progress_granularity, char immediate_load) { ImlibLoader *loader; - int src, dest, res; + int src; + int dest, res; char *file, *p, *q, tmp[] = "/tmp/imlib2_loader_zlib-XXXXXX"; char *real_ext; - struct stat st; /* check that this file ends in *.gz and that there's another ext * (e.g. "foo.png.gz" @@ -55,17 +55,25 @@ load(ImlibImage * im, ImlibProgressFunction progress, if (!p || p == im->real_file || strcasecmp(p + 1, "gz") || p == q) return 0; - if (stat(im->real_file, &st) < 0) + if (!(real_ext = strndup(im->real_file, p - im->real_file))) return 0; + if (!(loader = __imlib_FindBestLoaderForFile(real_ext, 0))) + { + free(real_ext); + return 0; + } + if ((src = open(im->real_file, O_RDONLY)) < 0) { + free(real_ext); return 0; } if ((dest = mkstemp(tmp)) < 0) { close(src); + free(real_ext); return 0; } @@ -75,15 +83,6 @@ load(ImlibImage * im, ImlibProgressFunction progress, if (!res) { - unlink(tmp); - return 0; - } - - if (!(real_ext = strndup(im->real_file, p - im->real_file))) - return 0; - - if (!(loader = __imlib_FindBestLoaderForFile(real_ext, 0))) - { free(real_ext); unlink(tmp); return 0; |