|  | @@ -0,0 +1,73 @@
 | 
	
		
			
				|  |  | +Subject: PR/69: Only consider arrays > 1 element when quickly figuring out if a (...)
 | 
	
		
			
				|  |  | +Origin: FILE5_36-32-g479e0995 <https://github.com/file/file/commit/FILE5_36-32-g479e0995>
 | 
	
		
			
				|  |  | +Upstream-Author: Christos Zoulas <christos@zoulas.com>
 | 
	
		
			
				|  |  | +Date: Sat Mar 2 01:08:10 2019 +0000
 | 
	
		
			
				|  |  | +Bug-Debian: https://bugs.debian.org/922874
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    PR/69: Only consider arrays > 1 element when quickly figuring out if a
 | 
	
		
			
				|  |  | +    file is JSON.
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +--- a/src/is_json.c
 | 
	
		
			
				|  |  | ++++ b/src/is_json.c
 | 
	
		
			
				|  |  | +@@ -52,7 +52,8 @@
 | 
	
		
			
				|  |  | + #define JSON_NUMBER	2
 | 
	
		
			
				|  |  | + #define JSON_OBJECT	3
 | 
	
		
			
				|  |  | + #define JSON_STRING	4
 | 
	
		
			
				|  |  | +-#define JSON_MAX	5
 | 
	
		
			
				|  |  | ++#define JSON_ARRAYN	5
 | 
	
		
			
				|  |  | ++#define JSON_MAX	6
 | 
	
		
			
				|  |  | + 
 | 
	
		
			
				|  |  | + /*
 | 
	
		
			
				|  |  | +  * if JSON_COUNT != 0:
 | 
	
		
			
				|  |  | +@@ -171,6 +172,7 @@
 | 
	
		
			
				|  |  | + 	size_t *st, size_t lvl)
 | 
	
		
			
				|  |  | + {
 | 
	
		
			
				|  |  | + 	const unsigned char *uc = *ucp;
 | 
	
		
			
				|  |  | ++	int more = 0;	/* Array has more than 1 element */
 | 
	
		
			
				|  |  | + 
 | 
	
		
			
				|  |  | + 	DPRINTF("Parse array: ", uc, *ucp);
 | 
	
		
			
				|  |  | + 	while (uc < ue) {
 | 
	
		
			
				|  |  | +@@ -180,9 +182,12 @@
 | 
	
		
			
				|  |  | + 			goto out;
 | 
	
		
			
				|  |  | + 		switch (*uc) {
 | 
	
		
			
				|  |  | + 		case ',':
 | 
	
		
			
				|  |  | ++			more++;
 | 
	
		
			
				|  |  | + 			uc++;
 | 
	
		
			
				|  |  | + 			continue;
 | 
	
		
			
				|  |  | + 		case ']':
 | 
	
		
			
				|  |  | ++			if (more)
 | 
	
		
			
				|  |  | ++				st[JSON_ARRAYN]++;
 | 
	
		
			
				|  |  | + 			*ucp = uc + 1;
 | 
	
		
			
				|  |  | + 			return 1;
 | 
	
		
			
				|  |  | + 		default:
 | 
	
		
			
				|  |  | +@@ -330,7 +335,7 @@
 | 
	
		
			
				|  |  | + 		return 0;
 | 
	
		
			
				|  |  | + #if JSON_COUNT
 | 
	
		
			
				|  |  | + 	/* bail quickly if not counting */
 | 
	
		
			
				|  |  | +-	if (lvl > 1 && (st[JSON_OBJECT] || st[JSON_ARRAY]))
 | 
	
		
			
				|  |  | ++	if (lvl > 1 && (st[JSON_OBJECT] || st[JSON_ARRAYN]))
 | 
	
		
			
				|  |  | + 		return 1;
 | 
	
		
			
				|  |  | + #endif
 | 
	
		
			
				|  |  | + 
 | 
	
		
			
				|  |  | +@@ -373,7 +378,7 @@
 | 
	
		
			
				|  |  | + 	*ucp = uc;
 | 
	
		
			
				|  |  | + 	DPRINTF("End general: ", uc, *ucp);
 | 
	
		
			
				|  |  | + 	if (lvl == 0)
 | 
	
		
			
				|  |  | +-		return rv && (st[JSON_ARRAY] || st[JSON_OBJECT]);
 | 
	
		
			
				|  |  | ++		return rv && (st[JSON_ARRAYN] || st[JSON_OBJECT]);
 | 
	
		
			
				|  |  | + 	return rv;
 | 
	
		
			
				|  |  | + }
 | 
	
		
			
				|  |  | + 
 | 
	
		
			
				|  |  | +@@ -408,8 +413,10 @@
 | 
	
		
			
				|  |  | + #define P(n) st[n], st[n] > 1 ? "s" : ""
 | 
	
		
			
				|  |  | + 	if (file_printf(ms, " (%" SIZE_T_FORMAT "u object%s, %" SIZE_T_FORMAT
 | 
	
		
			
				|  |  | + 	    "u array%s, %" SIZE_T_FORMAT "u string%s, %" SIZE_T_FORMAT
 | 
	
		
			
				|  |  | +-	    "u constant%s, %" SIZE_T_FORMAT "u number%s)", P(JSON_OBJECT),
 | 
	
		
			
				|  |  | +-	    P(JSON_ARRAY), P(JSON_STRING), P(JSON_CONSTANT), P(JSON_NUMBER))
 | 
	
		
			
				|  |  | ++	    "u constant%s, %" SIZE_T_FORMAT "u number%s, %" SIZE_T_FORMAT
 | 
	
		
			
				|  |  | ++	    "u >1array%s)",
 | 
	
		
			
				|  |  | ++	    P(JSON_OBJECT), P(JSON_ARRAY), P(JSON_STRING), P(JSON_CONSTANT),
 | 
	
		
			
				|  |  | ++	    P(JSON_NUMBER), P(JSON_ARRAYN))
 | 
	
		
			
				|  |  | + 	    == -1)
 | 
	
		
			
				|  |  | + 		return -1;
 | 
	
		
			
				|  |  | + #endif
 |