Fix: Filechooser preview of XML file shows it as a corrupt image (#926)

This commit is contained in:
ManoloFLTK 2024-03-11 11:36:47 +01:00
parent 7bbe75c84e
commit 20e8da9dfd

View File

@ -36,7 +36,6 @@
#include <FL/fl_utf8.h> #include <FL/fl_utf8.h>
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h>
#include "flstring.h" #include "flstring.h"
#if defined(HAVE_LIBZ) #if defined(HAVE_LIBZ)
#include <zlib.h> #include <zlib.h>
@ -126,22 +125,12 @@ fl_check_images(const char *name, // I - Filename
// SVG or SVGZ (gzip'ed SVG) // SVG or SVGZ (gzip'ed SVG)
#ifdef FLTK_USE_SVG #ifdef FLTK_USE_SVG
uchar header2[300]; // buffer for decompression uchar header2[64]; // buffer for decompression
uchar *buf = header; // original header data uchar *buf = header; // original header data
int count = headerlen; // original header data size int count = headerlen; // original header data size
// Note: variables 'buf' and 'count' may be overwritten subsequently // Note: variables 'buf' and 'count' may be overwritten subsequently
// if the image data is xml or gzip'ed *and* we can decompress the data // if the image data is gzip'ed *and* we can decompress the data
if (count >= 5 && memcmp(header, "<?xml", 5) == 0) {
FILE *in = fl_fopen(name, "r");
if (in) {
buf = header2;
count = sizeof(header2);
count = fread(header2, 1, count, in);
fclose(in);
}
}
# if defined(HAVE_LIBZ) # if defined(HAVE_LIBZ)
if (header[0] == 0x1f && header[1] == 0x8b) { // gzip'ed data if (header[0] == 0x1f && header[1] == 0x8b) { // gzip'ed data
@ -169,18 +158,17 @@ fl_check_images(const char *name, // I - Filename
} }
// Check svg or xml signature // Check svg or xml signature
bool found_svg = false;
if (count >= 4 && memcmp(buf, "<svg", 4) == 0) found_svg = true; while (count && isspace(buf[0])) { buf++; count--; }
else if (count >= 5 && memcmp(buf, "<?xml", 5) == 0) { if ((count >= 5 &&
uchar *p = buf; (memcmp(buf, "<?xml", 5) == 0 ||
do { memcmp(buf, "<svg", 4) == 0 ||
if (memcmp(p, "<svg", 4) == 0) { memcmp(buf, "<!--", 4) == 0))) {
found_svg = true; Fl_SVG_Image *image = new Fl_SVG_Image(name);
break; if (image->w() && image->h())
} return image;
} while (++p < buf + count - 4); delete image;
} }
if (found_svg) return new Fl_SVG_Image(name);
#endif // FLTK_USE_SVG #endif // FLTK_USE_SVG
// unknown image format // unknown image format