]> granicus.if.org Git - jq/commitdiff
Fix memory leak in libm cfunctions
authorWilliam Langford <wlangfor@gmail.com>
Sun, 5 Feb 2017 05:47:19 +0000 (00:47 -0500)
committerWilliam Langford <wlangfor@gmail.com>
Mon, 13 Feb 2017 16:36:20 +0000 (11:36 -0500)
src/builtin.c

index 24e311e11390a0ab647ee53720a33ac7498b1f9e..c278869ca59a4cf82b807e9e7c92aa13ee464270 100644 (file)
@@ -101,9 +101,15 @@ static jv f_ ## name(jq_state *jq, jv input) { \
 
 #define LIBM_DDD(name) \
 static jv f_ ## name(jq_state *jq, jv input, jv a, jv b) { \
-  if (jv_get_kind(a) != JV_KIND_NUMBER || jv_get_kind(b) != JV_KIND_NUMBER) \
-    return type_error(input, "number required"); \
   jv_free(input); \
+  if (jv_get_kind(a) != JV_KIND_NUMBER) { \
+    jv_free(b); \
+    return type_error(a, "number required"); \
+  } \
+  if (jv_get_kind(b) != JV_KIND_NUMBER) { \
+    jv_free(a); \
+    return type_error(b, "number required"); \
+  } \
   jv ret = jv_number(name(jv_number_value(a), jv_number_value(b))); \
   jv_free(a); \
   jv_free(b); \
@@ -113,9 +119,22 @@ static jv f_ ## name(jq_state *jq, jv input, jv a, jv b) { \
 
 #define LIBM_DDDD(name) \
 static jv f_ ## name(jq_state *jq, jv input, jv a, jv b, jv c) { \
-  if (jv_get_kind(a) != JV_KIND_NUMBER || jv_get_kind(b) != JV_KIND_NUMBER) \
-    return type_error(input, "number required"); \
   jv_free(input); \
+  if (jv_get_kind(a) != JV_KIND_NUMBER) { \
+    jv_free(b); \
+    jv_free(c); \
+    return type_error(a, "number required"); \
+  } \
+  if (jv_get_kind(b) != JV_KIND_NUMBER) { \
+    jv_free(a); \
+    jv_free(c); \
+    return type_error(b, "number required"); \
+  } \
+  if (jv_get_kind(c) != JV_KIND_NUMBER) { \
+    jv_free(a); \
+    jv_free(b); \
+    return type_error(c, "number required"); \
+  } \
   jv ret = jv_number(name(jv_number_value(a), jv_number_value(b), jv_number_value(c))); \
   jv_free(a); \
   jv_free(b); \