From e4b96fa8206793425248f50e81f412a5d2cb1fb5 Mon Sep 17 00:00:00 2001 From: Linus Wallgren Date: Thu, 1 Oct 2015 17:18:29 +0200 Subject: [PATCH] Handle invalid numbers Previously cJSON generated invalid JSON when a number was infinite or similar. This patch changes the behaviour to match javascript, that is to render such a number as null. --- cJSON.c | 7 ++++--- test.c | 3 +++ 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/cJSON.c b/cJSON.c index 460aeb4..9ac97f4 100644 --- a/cJSON.c +++ b/cJSON.c @@ -166,9 +166,10 @@ static char *print_number(cJSON *item,printbuffer *p) else str=(char*)cJSON_malloc(64); /* This is a nice tradeoff. */ if (str) { - if (fabs(floor(d)-d)<=DBL_EPSILON && fabs(d)<1.0e60)sprintf(str,"%.0f",d); - else if (fabs(d)<1.0e-6 || fabs(d)>1.0e9) sprintf(str,"%e",d); - else sprintf(str,"%f",d); + if (fpclassify(d) != FP_ZERO && !isnormal(d)) sprintf(str,"null"); + else if (fabs(floor(d)-d)<=DBL_EPSILON && fabs(d)<1.0e60) sprintf(str,"%.0f",d); + else if (fabs(d)<1.0e-6 || fabs(d)>1.0e9) sprintf(str,"%e",d); + else sprintf(str,"%f",d); } } return str; diff --git a/test.c b/test.c index 7832989..7192d68 100644 --- a/test.c +++ b/test.c @@ -131,6 +131,9 @@ void create_objects() out=cJSON_Print(root); cJSON_Delete(root); printf("%s\n",out); free(out); + root=cJSON_CreateObject(); + cJSON_AddNumberToObject(root,"number", 1.0/0.0); + out=cJSON_Print(root); cJSON_Delete(root); printf("%s\n",out); free(out); } int main (int argc, const char * argv[]) {