瀏覽代碼

fix: print_number didn't abort when out of memory

Max Bruckner 8 年之前
父節點
當前提交
cf1842dc6f
共有 1 個文件被更改,包括 23 次插入21 次删除
  1. 23 21
      cJSON.c

+ 23 - 21
cJSON.c

@@ -372,28 +372,30 @@ static cJSON_bool print_number(const cJSON * const item, printbuffer * const out
 
     /* This is a nice tradeoff. */
     output_pointer = ensure(output_buffer, 64, hooks);
-    if (output_pointer != NULL)
+    if (output_pointer == NULL)
     {
-        /* This checks for NaN and Infinity */
-        if ((d * 0) != 0)
-        {
-            length = sprintf((char*)output_pointer, "null");
-        }
-        else if ((fabs(floor(d) - d) <= DBL_EPSILON) && (fabs(d) < 1.0e60))
-        {
-            /* integer */
-            length = sprintf((char*)output_pointer, "%.0f", d);
-            trim_zeroes = false; /* don't remove zeroes for "big integers" */
-        }
-        else if ((fabs(d) < 1.0e-6) || (fabs(d) > 1.0e9))
-        {
-            length = sprintf((char*)output_pointer, "%e", d);
-            trim_zeroes = false; /* don't remove zeroes in engineering notation */
-        }
-        else
-        {
-            length = sprintf((char*)output_pointer, "%f", d);
-        }
+        return false;
+    }
+
+    /* This checks for NaN and Infinity */
+    if ((d * 0) != 0)
+    {
+        length = sprintf((char*)output_pointer, "null");
+    }
+    else if ((fabs(floor(d) - d) <= DBL_EPSILON) && (fabs(d) < 1.0e60))
+    {
+        /* integer */
+        length = sprintf((char*)output_pointer, "%.0f", d);
+        trim_zeroes = false; /* don't remove zeroes for "big integers" */
+    }
+    else if ((fabs(d) < 1.0e-6) || (fabs(d) > 1.0e9))
+    {
+        length = sprintf((char*)output_pointer, "%e", d);
+        trim_zeroes = false; /* don't remove zeroes in engineering notation */
+    }
+    else
+    {
+        length = sprintf((char*)output_pointer, "%f", d);
     }
 
     /* sprintf failed */