File evince-dvi-vulnerabilities.patch of Package evince

 backend/dvi/mdvi-lib/afmparse.c |    2 +-
 backend/dvi/mdvi-lib/dviread.c  |    4 ++++
 backend/dvi/mdvi-lib/pk.c       |    2 +-
 backend/dvi/mdvi-lib/tfmfile.c  |    3 ++-
 backend/dvi/mdvi-lib/vf.c       |    6 ++++++
 5 files changed, 14 insertions(+), 3 deletions(-)

diff --git a/backend/dvi/mdvi-lib/afmparse.c b/backend/dvi/mdvi-lib/afmparse.c
index 164366b..3de8ab5 100644
--- a/backend/dvi/mdvi-lib/afmparse.c
+++ b/backend/dvi/mdvi-lib/afmparse.c
@@ -160,7 +160,7 @@ static char *token(FILE *stream)
     
     idx = 0;
     while (ch != EOF && ch != ' ' && ch != lineterm 
-           && ch != '\t' && ch != ':' && ch != ';') 
+           && ch != '\t' && ch != ':' && ch != ';' && idx < MAX_NAME) 
     {
         ident[idx++] = ch;
         ch = fgetc(stream);
diff --git a/backend/dvi/mdvi-lib/dviread.c b/backend/dvi/mdvi-lib/dviread.c
index d696d8a..6056525 100644
--- a/backend/dvi/mdvi-lib/dviread.c
+++ b/backend/dvi/mdvi-lib/dviread.c
@@ -1537,6 +1537,10 @@ int	special(DviContext *dvi, int opcode)
 	Int32	arg;
 	
 	arg = dugetn(dvi, opcode - DVI_XXX1 + 1);
+        if (arg <= 0) {
+          dvierr(dvi, _("malformed special length\n"));
+          return -1;
+        }
 	s = mdvi_malloc(arg + 1);
 	dread(dvi, s, arg);
 	s[arg] = 0;
diff --git a/backend/dvi/mdvi-lib/pk.c b/backend/dvi/mdvi-lib/pk.c
index 98ef26b..89682e8 100644
--- a/backend/dvi/mdvi-lib/pk.c
+++ b/backend/dvi/mdvi-lib/pk.c
@@ -512,7 +512,7 @@ static int pk_load_font(DviParams *unused, DviFont *font)
 	}
 
 	/* resize font char data */
-	if(loc > 0 || hic < maxch-1) {
+	if(loc > 0 && hic < maxch-1) {
 		memmove(font->chars, font->chars + loc, 
 			(hic - loc + 1) * sizeof(DviFontChar));
 		font->chars = xresize(font->chars,
diff --git a/backend/dvi/mdvi-lib/tfmfile.c b/backend/dvi/mdvi-lib/tfmfile.c
index cab4f19..8233bf5 100644
--- a/backend/dvi/mdvi-lib/tfmfile.c
+++ b/backend/dvi/mdvi-lib/tfmfile.c
@@ -172,7 +172,8 @@ int	tfm_load_file(const char *filename, TFMInfo *info)
 	/* We read the entire TFM file into core */
 	if(fstat(fileno(in), &st) < 0)
 		return -1;
-	if(st.st_size == 0)
+        /* according to the spec, TFM files are smaller than 16K */
+        if(st.st_size == 0 || st.st_size >= 16384)
 		goto bad_tfm;
 
 	/* allocate a word-aligned buffer to hold the file */
diff --git a/backend/dvi/mdvi-lib/vf.c b/backend/dvi/mdvi-lib/vf.c
index 3826ae8..c7edd45 100644
--- a/backend/dvi/mdvi-lib/vf.c
+++ b/backend/dvi/mdvi-lib/vf.c
@@ -165,6 +165,12 @@ static int vf_load_font(DviParams *params, DviFont *font)
 			cc = fuget1(p);
 			tfm = fuget3(p);
 		}
+                if (cc < 0 || cc > 65536) {
+                  /* TeX engines do not support char codes bigger than 65535 */
+                  mdvi_error(_("(vf) %s: unexpected character %d\n"),
+                             font->fontname, cc);
+                  goto error;
+                }
 		if(loc < 0 || cc < loc)
 			loc = cc;
 		if(hic < 0 || cc > hic)
openSUSE Build Service is sponsored by