From 3ddf3a59112aa1723b0ff98c7d48b62b3ef641ef Mon Sep 17 00:00:00 2001 From: Dave Gamble Date: Tue, 5 Feb 2013 17:14:12 +0000 Subject: [PATCH] stable solution for printing arrays - based on patch donated by Jerome Lang. Resolves issue in case malloc(0)!=0. git-svn-id: http://svn.code.sf.net/p/cjson/code@44 e3330c51-1366-4df0-8b21-3ccf24e3d50e --- cJSON.c | 31 +++++++++++++++++-------------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/cJSON.c b/cJSON.c index 27c3385..027f440 100644 --- a/cJSON.c +++ b/cJSON.c @@ -327,25 +327,28 @@ 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; + char **entries=0; 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; - /* 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) + if (numentries) { - 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; + /* 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 */ @@ -357,7 +360,7 @@ static char *print_array(cJSON *item,int depth,int fmt) if (fail) { for (i=0;i