| 
					
				 | 
			
			
				@@ -0,0 +1,153 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+Upstream-Author: Christos Zoulas <christos@zoulas.com> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+Date: Wed Jan 8 22:22:54 2014 +0000 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+Last-Update: 2014-03-05 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+Upstream-Commit: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    447558595a3650db2886cd2f416ad0beba965801 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    70c65d2e1841491f59168db1f905e8b14083fb1c 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+Description: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ PR/313: Aaron Reffett: Check properly for exceeding the offset. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ . 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ off by one in out of bounds calculations (Jan Kaluza) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ . 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ CVE-2014-2270 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ Backport for 5.04: Christoph Biedl <debian.axhn@manchmal.in-ulm.de> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+--- a/src/softmagic.c 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				++++ b/src/softmagic.c 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+@@ -60,6 +60,7 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ private void cvt_32(union VALUETYPE *, const struct magic *); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ private void cvt_64(union VALUETYPE *, const struct magic *); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				++#define OFFSET_OOB(n, o, i)	((n) < (o) || (i) > ((n) - (o))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ /* 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  * softmagic - lookup one file in parsed, in-memory copy of database 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  * Passed the name and FILE * of one file to be typed. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+@@ -1085,7 +1086,7 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 		switch (m->in_type) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 		case FILE_BYTE: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+-			if (nbytes < (offset + 1)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				++			if (OFFSET_OOB(nbytes, offset, 1)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 				return 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 			if (off) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 				switch (m->in_op & FILE_OPS_MASK) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+@@ -1120,7 +1121,7 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 				offset = ~offset; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 			break; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 		case FILE_BESHORT: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+-			if (nbytes < (offset + 2)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				++			if (OFFSET_OOB(nbytes, offset, 2)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 				return 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 			if (off) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 				switch (m->in_op & FILE_OPS_MASK) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+@@ -1172,7 +1173,7 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 				offset = ~offset; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 			break; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 		case FILE_LESHORT: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+-			if (nbytes < (offset + 2)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				++			if (OFFSET_OOB(nbytes, offset, 2)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 				return 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 			if (off) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 				switch (m->in_op & FILE_OPS_MASK) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+@@ -1224,7 +1225,7 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 				offset = ~offset; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 			break; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 		case FILE_SHORT: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+-			if (nbytes < (offset + 2)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				++			if (OFFSET_OOB(nbytes, offset, 2)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 				return 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 			if (off) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 				switch (m->in_op & FILE_OPS_MASK) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+@@ -1261,7 +1262,7 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 			break; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 		case FILE_BELONG: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 		case FILE_BEID3: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+-			if (nbytes < (offset + 4)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				++			if (OFFSET_OOB(nbytes, offset, 4)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 				return 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 			if (off) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 				switch (m->in_op & FILE_OPS_MASK) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+@@ -1332,7 +1333,7 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 			break; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 		case FILE_LELONG: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 		case FILE_LEID3: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+-			if (nbytes < (offset + 4)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				++			if (OFFSET_OOB(nbytes, offset, 4)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 				return 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 			if (off) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 				switch (m->in_op & FILE_OPS_MASK) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+@@ -1402,7 +1403,7 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 				offset = ~offset; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 			break; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 		case FILE_MELONG: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+-			if (nbytes < (offset + 4)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				++			if (OFFSET_OOB(nbytes, offset, 4)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 				return 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 			if (off) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 				switch (m->in_op & FILE_OPS_MASK) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+@@ -1472,7 +1473,7 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 				offset = ~offset; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 			break; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 		case FILE_LONG: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+-			if (nbytes < (offset + 4)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				++			if (OFFSET_OOB(nbytes, offset, 4)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 				return 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 			if (off) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 				switch (m->in_op & FILE_OPS_MASK) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+@@ -1539,14 +1540,14 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 	/* Verify we have enough data to match magic type */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 	switch (m->type) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 	case FILE_BYTE: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+-		if (nbytes < (offset + 1)) /* should alway be true */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				++		if (OFFSET_OOB(nbytes, offset, 1)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 			return 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 		break; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 	case FILE_SHORT: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 	case FILE_BESHORT: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 	case FILE_LESHORT: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+-		if (nbytes < (offset + 2)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				++		if (OFFSET_OOB(nbytes, offset, 2)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 			return 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 		break; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+@@ -1565,26 +1566,26 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 	case FILE_FLOAT: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 	case FILE_BEFLOAT: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 	case FILE_LEFLOAT: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+-		if (nbytes < (offset + 4)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				++		if (OFFSET_OOB(nbytes, offset, 4)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 			return 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 		break; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 	case FILE_DOUBLE: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 	case FILE_BEDOUBLE: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 	case FILE_LEDOUBLE: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+-		if (nbytes < (offset + 8)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				++		if (OFFSET_OOB(nbytes, offset, 8)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 			return 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 		break; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 	case FILE_STRING: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 	case FILE_PSTRING: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 	case FILE_SEARCH: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+-		if (nbytes < (offset + m->vallen)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				++		if (OFFSET_OOB(nbytes, offset, m->vallen)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 			return 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 		break; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 	case FILE_REGEX: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+-		if (nbytes < offset) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				++		if (OFFSET_OOB(nbytes, offset, 0)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 			return 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 		break; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+@@ -1594,7 +1595,7 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 	  	if ((ms->flags & (MAGIC_MIME|MAGIC_APPLE)) == 0 && 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 		    file_printf(ms, "%s", m->desc) == -1) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 			return -1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+-		if (nbytes < offset) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				++		if (OFFSET_OOB(nbytes, offset, 0)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 			return 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 		return file_softmagic(ms, s + offset, nbytes - offset, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 		    recursion_level, BINTEST); 
			 |