|  | @@ -327,28 +327,32 @@ static const char *parse_array(cJSON *item,const char *value)
 | 
	
		
			
				|  |  |  /* Render an array to text */
 | 
	
		
			
				|  |  |  static char *print_array(cJSON *item,int depth,int fmt)
 | 
	
		
			
				|  |  |  {
 | 
	
		
			
				|  |  | -	char **entries=0;
 | 
	
		
			
				|  |  | +	char **entries;
 | 
	
		
			
				|  |  |  	char *out=0,*ptr,*ret;int len=5;
 | 
	
		
			
				|  |  |  	cJSON *child=item->child;
 | 
	
		
			
				|  |  |  	int numentries=0,i=0,fail=0;
 | 
	
		
			
				|  |  |  	
 | 
	
		
			
				|  |  |  	/* How many entries in the array? */
 | 
	
		
			
				|  |  |  	while (child) numentries++,child=child->next;
 | 
	
		
			
				|  |  | -	if (numentries)
 | 
	
		
			
				|  |  | +	/* Explicitly handle numentries==0 */
 | 
	
		
			
				|  |  | +	if (!numentries)
 | 
	
		
			
				|  |  |  	{
 | 
	
		
			
				|  |  | -		/* Allocate an array to hold the values for each */
 | 
	
		
			
				|  |  | -		entries=(char**)cJSON_malloc(numentries*sizeof(char*));
 | 
	
		
			
				|  |  | -		if (!entries) return 0;
 | 
	
		
			
				|  |  | -		memset(entries,0,numentries*sizeof(char*));
 | 
	
		
			
				|  |  | -		/* Retrieve all the results: */
 | 
	
		
			
				|  |  | -		child=item->child;
 | 
	
		
			
				|  |  | -		while (child && !fail)
 | 
	
		
			
				|  |  | -		{
 | 
	
		
			
				|  |  | -			ret=print_value(child,depth+1,fmt);
 | 
	
		
			
				|  |  | -			entries[i++]=ret;
 | 
	
		
			
				|  |  | -			if (ret) len+=strlen(ret)+2+(fmt?1:0); else fail=1;
 | 
	
		
			
				|  |  | -			child=child->next;
 | 
	
		
			
				|  |  | -		}
 | 
	
		
			
				|  |  | +		out=(char*)cJSON_malloc(3);
 | 
	
		
			
				|  |  | +		if (out) strcpy(out,"[]");
 | 
	
		
			
				|  |  | +		return out;
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +	/* Allocate an array to hold the values for each */
 | 
	
		
			
				|  |  | +	entries=(char**)cJSON_malloc(numentries*sizeof(char*));
 | 
	
		
			
				|  |  | +	if (!entries) return 0;
 | 
	
		
			
				|  |  | +	memset(entries,0,numentries*sizeof(char*));
 | 
	
		
			
				|  |  | +	/* Retrieve all the results: */
 | 
	
		
			
				|  |  | +	child=item->child;
 | 
	
		
			
				|  |  | +	while (child && !fail)
 | 
	
		
			
				|  |  | +	{
 | 
	
		
			
				|  |  | +		ret=print_value(child,depth+1,fmt);
 | 
	
		
			
				|  |  | +		entries[i++]=ret;
 | 
	
		
			
				|  |  | +		if (ret) len+=strlen(ret)+2+(fmt?1:0); else fail=1;
 | 
	
		
			
				|  |  | +		child=child->next;
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  |  	
 | 
	
		
			
				|  |  |  	/* If we didn't fail, try to malloc the output string */
 | 
	
	
		
			
				|  | @@ -360,7 +364,7 @@ static char *print_array(cJSON *item,int depth,int fmt)
 | 
	
		
			
				|  |  |  	if (fail)
 | 
	
		
			
				|  |  |  	{
 | 
	
		
			
				|  |  |  		for (i=0;i<numentries;i++) if (entries[i]) cJSON_free(entries[i]);
 | 
	
		
			
				|  |  | -		if (entries) cJSON_free(entries);
 | 
	
		
			
				|  |  | +		cJSON_free(entries);
 | 
	
		
			
				|  |  |  		return 0;
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  |  	
 | 
	
	
		
			
				|  | @@ -373,7 +377,7 @@ static char *print_array(cJSON *item,int depth,int fmt)
 | 
	
		
			
				|  |  |  		if (i!=numentries-1) {*ptr++=',';if(fmt)*ptr++=' ';*ptr=0;}
 | 
	
		
			
				|  |  |  		cJSON_free(entries[i]);
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  | -	if (entries) cJSON_free(entries);
 | 
	
		
			
				|  |  | +	cJSON_free(entries);
 | 
	
		
			
				|  |  |  	*ptr++=']';*ptr++=0;
 | 
	
		
			
				|  |  |  	return out;	
 | 
	
		
			
				|  |  |  }
 | 
	
	
		
			
				|  | @@ -423,6 +427,16 @@ static char *print_object(cJSON *item,int depth,int fmt)
 | 
	
		
			
				|  |  |  	int numentries=0,fail=0;
 | 
	
		
			
				|  |  |  	/* Count the number of entries. */
 | 
	
		
			
				|  |  |  	while (child) numentries++,child=child->next;
 | 
	
		
			
				|  |  | +	/* Explicitly handle empty object case */
 | 
	
		
			
				|  |  | +	if (!numentries)
 | 
	
		
			
				|  |  | +	{
 | 
	
		
			
				|  |  | +		out=cJSON_malloc(fmt?depth+3:3);
 | 
	
		
			
				|  |  | +		if (!out)	return 0;
 | 
	
		
			
				|  |  | +		ptr=out;*ptr++='{';
 | 
	
		
			
				|  |  | +		if (fmt) {*ptr++='\n';for (i=0;i<depth-1;i++) *ptr++='\t';}
 | 
	
		
			
				|  |  | +		*ptr++='}';*ptr++=0;
 | 
	
		
			
				|  |  | +		return out;
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  |  	/* Allocate space for the names and the objects */
 | 
	
		
			
				|  |  |  	entries=(char**)cJSON_malloc(numentries*sizeof(char*));
 | 
	
		
			
				|  |  |  	if (!entries) return 0;
 |