f4b35e
diff -urNp old/plug-ins/file-fli/fli.c new/plug-ins/file-fli/fli.c
f4b35e
--- old/plug-ins/file-fli/fli.c	2018-01-04 12:19:54.714139464 +0100
f4b35e
+++ new/plug-ins/file-fli/fli.c	2018-01-04 12:34:18.568323629 +0100
f4b35e
@@ -25,6 +25,8 @@
f4b35e
 
f4b35e
 #include "config.h"
f4b35e
 
f4b35e
+#include <glib/gstdio.h>
f4b35e
+
f4b35e
 #include <string.h>
f4b35e
 #include <stdio.h>
f4b35e
 
f4b35e
@@ -461,23 +463,27 @@ void fli_read_brun(FILE *f, s_fli_header
f4b35e
 	unsigned short yc;
f4b35e
 	unsigned char *pos;
f4b35e
 	for (yc=0; yc < fli_header->height; yc++) {
f4b35e
-		unsigned short xc, pc, pcnt;
f4b35e
+		unsigned short pc, pcnt;
f4b35e
+                size_t n, xc;
f4b35e
 		pc=fli_read_char(f);
f4b35e
 		xc=0;
f4b35e
 		pos=framebuf+(fli_header->width * yc);
f4b35e
+                n=(size_t)fli_header->width * (fli_header->height-yc);
f4b35e
 		for (pcnt=pc; pcnt>0; pcnt--) {
f4b35e
 			unsigned short ps;
f4b35e
 			ps=fli_read_char(f);
f4b35e
 			if (ps & 0x80) {
f4b35e
 				unsigned short len;
f4b35e
-				for (len=-(signed char)ps; len>0; len--) {
f4b35e
+				for (len=-(signed char)ps; len>0 && xc
f4b35e
 					pos[xc++]=fli_read_char(f);
f4b35e
 				}
f4b35e
 			} else {
f4b35e
 				unsigned char val;
f4b35e
+                                size_t len;
f4b35e
+                                len=MIN(n-xc,ps);
f4b35e
 				val=fli_read_char(f);
f4b35e
-				memset(&(pos[xc]), val, ps);
f4b35e
-				xc+=ps;
f4b35e
+				memset(&(pos[xc]), val, len);
f4b35e
+				xc+=len;
f4b35e
 			}
f4b35e
 		}
f4b35e
 	}
f4b35e
@@ -564,25 +570,34 @@ void fli_read_lc(FILE *f, s_fli_header *
f4b35e
 	memcpy(framebuf, old_framebuf, fli_header->width * fli_header->height);
f4b35e
 	firstline = fli_read_short(f);
f4b35e
 	numline = fli_read_short(f);
f4b35e
+        if (numline > fli_header->height || fli_header->height-numline < firstline)
f4b35e
+                return;
f4b35e
+
f4b35e
 	for (yc=0; yc < numline; yc++) {
f4b35e
-		unsigned short xc, pc, pcnt;
f4b35e
+		unsigned short pc, pcnt;
f4b35e
+                size_t n, xc;
f4b35e
 		pc=fli_read_char(f);
f4b35e
 		xc=0;
f4b35e
 		pos=framebuf+(fli_header->width * (firstline+yc));
f4b35e
+                n=(size_t)fli_header->width * (fli_header->height-firstline-yc);
f4b35e
 		for (pcnt=pc; pcnt>0; pcnt--) {
f4b35e
 			unsigned short ps,skip;
f4b35e
 			skip=fli_read_char(f);
f4b35e
 			ps=fli_read_char(f);
f4b35e
-			xc+=skip;
f4b35e
+			xc+=MIN(n-xc,skip);
f4b35e
 			if (ps & 0x80) {
f4b35e
 				unsigned char val;
f4b35e
+                                size_t len;
f4b35e
 				ps=-(signed char)ps;
f4b35e
 				val=fli_read_char(f);
f4b35e
-				memset(&(pos[xc]), val, ps);
f4b35e
-				xc+=ps;
f4b35e
+                                len=MIN(n-xc,ps);
f4b35e
+				memset(&(pos[xc]), val, len);
f4b35e
+				xc+=len;
f4b35e
 			} else {
f4b35e
-				fread(&(pos[xc]), ps, 1, f);
f4b35e
-				xc+=ps;
f4b35e
+                                size_t len;
f4b35e
+                                len=MIN(n-xc,ps);
f4b35e
+				fread(&(pos[xc]), len, 1, f);
f4b35e
+				xc+=len;
f4b35e
 			}
f4b35e
 		}
f4b35e
 	}
f4b35e
@@ -689,7 +704,8 @@ void fli_read_lc_2(FILE *f, s_fli_header
f4b35e
 	yc=0;
f4b35e
 	numline = fli_read_short(f);
f4b35e
 	for (lc=0; lc < numline; lc++) {
f4b35e
-		unsigned short xc, pc, pcnt, lpf, lpn;
f4b35e
+		unsigned short pc, pcnt, lpf, lpn;
f4b35e
+                size_t n, xc;
f4b35e
 		pc=fli_read_short(f);
f4b35e
 		lpf=0; lpn=0;
f4b35e
 		while (pc & 0x8000) {
f4b35e
@@ -700,26 +716,30 @@ void fli_read_lc_2(FILE *f, s_fli_header
f4b35e
 			}
f4b35e
 			pc=fli_read_short(f);
f4b35e
 		}
f4b35e
+                yc=MIN(yc, fli_header->height);
f4b35e
 		xc=0;
f4b35e
 		pos=framebuf+(fli_header->width * yc);
f4b35e
+                n=(size_t)fli_header->width * (fli_header->height-yc);
f4b35e
 		for (pcnt=pc; pcnt>0; pcnt--) {
f4b35e
 			unsigned short ps,skip;
f4b35e
 			skip=fli_read_char(f);
f4b35e
 			ps=fli_read_char(f);
f4b35e
-			xc+=skip;
f4b35e
+			xc+=MIN(n-xc,skip);
f4b35e
 			if (ps & 0x80) {
f4b35e
 				unsigned char v1,v2;
f4b35e
 				ps=-(signed char)ps;
f4b35e
 				v1=fli_read_char(f);
f4b35e
 				v2=fli_read_char(f);
f4b35e
-				while (ps>0) {
f4b35e
+				while (ps>0 && xc+1
f4b35e
 					pos[xc++]=v1;
f4b35e
 					pos[xc++]=v2;
f4b35e
 					ps--;
f4b35e
 				}
f4b35e
 			} else {
f4b35e
-				fread(&(pos[xc]), ps, 2, f);
f4b35e
-				xc+=ps << 1;
f4b35e
+                                size_t len;
f4b35e
+                                len=MIN((n-xc)/2,ps);
f4b35e
+				fread(&(pos[xc]), len, 2, f);
f4b35e
+				xc+=len << 1;
f4b35e
 			}
f4b35e
 		}
f4b35e
 		if (lpf) pos[xc]=lpn;