Blame SOURCES/fontforge-20170731-cve-2020-5395.patch

1917f8
From 048a91e2682c1a8936ae34dbc7bd70291ec05410 Mon Sep 17 00:00:00 2001
1917f8
From: Skef Iterum <unknown>
1917f8
Date: Mon, 6 Jan 2020 03:05:06 -0800
1917f8
Subject: [PATCH] Fix for #4084 Use-after-free (heap) in the
1917f8
 SFD_GetFontMetaData() function Fix for #4086 NULL pointer dereference in the
1917f8
 SFDGetSpiros() function Fix for #4088 NULL pointer dereference in the
1917f8
 SFD_AssignLookups() function Add empty sf->fontname string if it isn't set,
1917f8
 fixing #4089 #4090 and many   other potential issues (many downstream calls
1917f8
 to strlen() on the value).
1917f8
1917f8
---
1917f8
 fontforge/sfd.c  | 19 ++++++++++++++-----
1917f8
 fontforge/sfd1.c |  2 +-
1917f8
 2 files changed, 15 insertions(+), 6 deletions(-)
1917f8
1917f8
diff --git a/fontforge/sfd.c b/fontforge/sfd.c
1917f8
index 731be201e0..e8ca39ba83 100644
1917f8
--- a/fontforge/sfd.c
1917f8
+++ b/fontforge/sfd.c
1917f8
@@ -4032,13 +4032,16 @@ static void SFDGetSpiros(FILE *sfd,SplineSet *cur) {
1917f8
     while ( fscanf(sfd,"%lg %lg %c", &cp.x, &cp.y, &cp.ty )==3 ) {
1917f8
 	if ( cur!=NULL ) {
1917f8
 	    if ( cur->spiro_cnt>=cur->spiro_max )
1917f8
-		cur->spiros = realloc(cur->spiros,(cur->spiro_max+=10)*sizeof(spiro_cp));
1917f8
+		cur->spiros = realloc(cur->spiros,
1917f8
+		                      (cur->spiro_max+=10)*sizeof(spiro_cp));
1917f8
 	    cur->spiros[cur->spiro_cnt++] = cp;
1917f8
 	}
1917f8
     }
1917f8
-    if ( cur!=NULL && (cur->spiros[cur->spiro_cnt-1].ty&0x7f)!=SPIRO_END ) {
1917f8
+    if (    cur!=NULL && cur->spiro_cnt>0
1917f8
+         && (cur->spiros[cur->spiro_cnt-1].ty&0x7f)!=SPIRO_END ) {
1917f8
 	if ( cur->spiro_cnt>=cur->spiro_max )
1917f8
-	    cur->spiros = realloc(cur->spiros,(cur->spiro_max+=1)*sizeof(spiro_cp));
1917f8
+	    cur->spiros = realloc(cur->spiros,
1917f8
+	                          (cur->spiro_max+=1)*sizeof(spiro_cp));
1917f8
 	memset(&cur->spiros[cur->spiro_cnt],0,sizeof(spiro_cp));
1917f8
 	cur->spiros[cur->spiro_cnt++].ty = SPIRO_END;
1917f8
     }
1917f8
@@ -7992,10 +7995,12 @@ bool SFD_GetFontMetaData( FILE *sfd,
1917f8
     else if ( strmatch(tok,"LayerCount:")==0 )
1917f8
     {
1917f8
 	d->had_layer_cnt = true;
1917f8
-	getint(sfd,&sf->layer_cnt);
1917f8
-	if ( sf->layer_cnt>2 ) {
1917f8
+	int layer_cnt_tmp;
1917f8
+	getint(sfd,&layer_cnt_tmp);
1917f8
+	if ( layer_cnt_tmp>2 ) {
1917f8
 	    sf->layers = realloc(sf->layers,sf->layer_cnt*sizeof(LayerInfo));
1917f8
 	    memset(sf->layers+2,0,(sf->layer_cnt-2)*sizeof(LayerInfo));
1917f8
+	    sf->layer_cnt = layer_cnt_tmp;
1917f8
 	}
1917f8
     }
1917f8
     else if ( strmatch(tok,"Layer:")==0 )
1917f8
@@ -8948,6 +8953,10 @@ exit( 1 );
1917f8
 	}
1917f8
     }
1917f8
 
1917f8
+    // Many downstream functions assume this isn't NULL (use strlen, etc.)
1917f8
+    if ( sf->fontname==NULL)
1917f8
+	sf->fontname = copy("");
1917f8
+
1917f8
     if ( fromdir )
1917f8
 	sf = SFD_FigureDirType(sf,tok,dirname,enc,remap,had_layer_cnt);
1917f8
     else if ( sf->subfontcnt!=0 ) {
1917f8
diff --git a/fontforge/sfd1.c b/fontforge/sfd1.c
1917f8
index cf931059d0..b42f832678 100644
1917f8
--- a/fontforge/sfd1.c
1917f8
+++ b/fontforge/sfd1.c
1917f8
@@ -674,7 +674,7 @@ void SFD_AssignLookups(SplineFont1 *sf) {
1917f8
 
1917f8
     /* Fix up some gunk from really old versions of the sfd format */
1917f8
     SFDCleanupAnchorClasses(&sf->sf);
1917f8
-    if ( sf->sf.uni_interp==ui_unset )
1917f8
+    if ( sf->sf.uni_interp==ui_unset && sf->sf.map!=NULL )
1917f8
 	sf->sf.uni_interp = interp_from_encoding(sf->sf.map->enc,ui_none);
1917f8
 
1917f8
     /* Fixup for an old bug */