From c8315930e6a34b616d9840985c85eb0d856dd2df Mon Sep 17 00:00:00 2001 From: Andrew Dunstan Date: Tue, 16 Dec 2014 10:32:06 -0500 Subject: [PATCH] Fix some jsonb issues found by Coverity in recent commits. Mostly these issues concern the non-use of function results. These have been changed to use (void) pushJsonbValue(...) instead of assigning the result to a variable that gets overwritten before it is used. There is a larger issue that we should possibly examine the API for pushJsonbValue(), so that instead of returning a value it modifies a state argument. The current idiom is rather clumsy. However, changing that requires quite a bit more work, so this change should do for the moment. --- src/backend/utils/adt/jsonb.c | 16 ++++++++-------- src/backend/utils/adt/jsonfuncs.c | 4 +++- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/src/backend/utils/adt/jsonb.c b/src/backend/utils/adt/jsonb.c index a520b361b8..80c8ee1135 100644 --- a/src/backend/utils/adt/jsonb.c +++ b/src/backend/utils/adt/jsonb.c @@ -1194,7 +1194,7 @@ jsonb_build_object_noargs(PG_FUNCTION_ARGS) memset(&result, 0, sizeof(JsonbInState)); - result.res = pushJsonbValue(&result.parseState, WJB_BEGIN_OBJECT, NULL); + (void) pushJsonbValue(&result.parseState, WJB_BEGIN_OBJECT, NULL); result.res = pushJsonbValue(&result.parseState, WJB_END_OBJECT, NULL); PG_RETURN_POINTER(JsonbValueToJsonb(result.res)); @@ -1255,7 +1255,7 @@ jsonb_build_array_noargs(PG_FUNCTION_ARGS) memset(&result, 0, sizeof(JsonbInState)); - result.res = pushJsonbValue(&result.parseState, WJB_BEGIN_ARRAY, NULL); + (void) pushJsonbValue(&result.parseState, WJB_BEGIN_ARRAY, NULL); result.res = pushJsonbValue(&result.parseState, WJB_END_ARRAY, NULL); PG_RETURN_POINTER(JsonbValueToJsonb(result.res)); @@ -1283,7 +1283,7 @@ jsonb_object(PG_FUNCTION_ARGS) memset(&result, 0, sizeof(JsonbInState)); - result.res = pushJsonbValue(&result.parseState, WJB_BEGIN_OBJECT, NULL); + (void) pushJsonbValue(&result.parseState, WJB_BEGIN_OBJECT, NULL); switch (ndims) { @@ -1336,7 +1336,7 @@ jsonb_object(PG_FUNCTION_ARGS) v.val.string.len = len; v.val.string.val = str; - result.res = pushJsonbValue(&result.parseState, WJB_KEY, &v); + (void) pushJsonbValue(&result.parseState, WJB_KEY, &v); if (in_nulls[i * 2 + 1]) { @@ -1353,7 +1353,7 @@ jsonb_object(PG_FUNCTION_ARGS) v.val.string.val = str; } - result.res = pushJsonbValue(&result.parseState, WJB_VALUE, &v); + (void) pushJsonbValue(&result.parseState, WJB_VALUE, &v); } pfree(in_datums); @@ -1389,7 +1389,7 @@ jsonb_object_two_arg(PG_FUNCTION_ARGS) memset(&result, 0, sizeof(JsonbInState)); - result.res = pushJsonbValue(&result.parseState, WJB_BEGIN_OBJECT, NULL); + (void) pushJsonbValue(&result.parseState, WJB_BEGIN_OBJECT, NULL); if (nkdims > 1 || nkdims != nvdims) ereport(ERROR, @@ -1431,7 +1431,7 @@ jsonb_object_two_arg(PG_FUNCTION_ARGS) v.val.string.len = len; v.val.string.val = str; - result.res = pushJsonbValue(&result.parseState, WJB_KEY, &v); + (void) pushJsonbValue(&result.parseState, WJB_KEY, &v); if (val_nulls[i]) { @@ -1448,7 +1448,7 @@ jsonb_object_two_arg(PG_FUNCTION_ARGS) v.val.string.val = str; } - result.res = pushJsonbValue(&result.parseState, WJB_VALUE, &v); + (void) pushJsonbValue(&result.parseState, WJB_VALUE, &v); } result.res = pushJsonbValue(&result.parseState, WJB_END_OBJECT, NULL); diff --git a/src/backend/utils/adt/jsonfuncs.c b/src/backend/utils/adt/jsonfuncs.c index 0a85ee8109..93cbe274f0 100644 --- a/src/backend/utils/adt/jsonfuncs.c +++ b/src/backend/utils/adt/jsonfuncs.c @@ -3182,7 +3182,7 @@ jsonb_strip_nulls(PG_FUNCTION_ARGS) continue; /* otherwise, do a delayed push of the key */ - res = pushJsonbValue(&parseState, WJB_KEY, &k); + (void) pushJsonbValue(&parseState, WJB_KEY, &k); } if (type == WJB_VALUE || type == WJB_ELEM) @@ -3191,5 +3191,7 @@ jsonb_strip_nulls(PG_FUNCTION_ARGS) res = pushJsonbValue(&parseState, type, NULL); } + Assert(res != NULL); + PG_RETURN_POINTER(JsonbValueToJsonb(res)); }