diff --git a/src/ioc/db/dbChannel.c b/src/ioc/db/dbChannel.c index e16f8e740..92be08c77 100644 --- a/src/ioc/db/dbChannel.c +++ b/src/ioc/db/dbChannel.c @@ -267,7 +267,7 @@ static long chf_parse(dbChannel *chan, const char **pjson) { chan, NULL, 0 }; yajl_handle yh = yajl_alloc(&chf_callbacks, &chf_alloc, &parser); const char *json = *pjson; - size_t jlen = strlen(json); + size_t jlen = strlen(json), ylen; yajl_status ys; long status; @@ -275,11 +275,15 @@ static long chf_parse(dbChannel *chan, const char **pjson) return S_db_noMemory; ys = yajl_parse(yh, (const unsigned char *) json, jlen); + ylen = yajl_get_bytes_consumed(yh); + + if (ys == yajl_status_ok) + ys = yajl_complete_parse(yh); switch (ys) { case yajl_status_ok: + *pjson += ylen; status = 0; - *pjson += yajl_get_bytes_consumed(yh); break; case yajl_status_error: { diff --git a/src/ioc/db/dbConvertJSON.c b/src/ioc/db/dbConvertJSON.c index c9a7d449d..eb697eeda 100644 --- a/src/ioc/db/dbConvertJSON.c +++ b/src/ioc/db/dbConvertJSON.c @@ -171,6 +171,8 @@ long dbPutConvertJSON(const char *json, short dbrType, return S_db_noMemory; ys = yajl_parse(yh, (const unsigned char *) json, jlen); + if (ys == yajl_status_ok) + ys = yajl_complete_parse(yh); switch (ys) { case yajl_status_ok: diff --git a/src/ioc/db/dbJLink.c b/src/ioc/db/dbJLink.c index 109785b6d..ea054eee9 100644 --- a/src/ioc/db/dbJLink.c +++ b/src/ioc/db/dbJLink.c @@ -365,6 +365,8 @@ long dbJLinkParse(const char *json, size_t jlen, short dbfType, return S_db_noMemory; ys = yajl_parse(yh, (const unsigned char *) json, jlen); + if (ys == yajl_status_ok) + ys = yajl_complete_parse(yh); switch (ys) { unsigned char *err; @@ -380,6 +382,7 @@ long dbJLinkParse(const char *json, size_t jlen, short dbfType, errlogPrintf("dbJLinkInit: %s\n", err); yajl_free_error(yh, err); dbJLinkFree(parser->pjlink); + dbJLinkFree(parser->product); /* fall through */ default: status = S_db_badField; diff --git a/src/ioc/db/test/dbPutLinkTest.c b/src/ioc/db/test/dbPutLinkTest.c index b39b98db2..e4a6ebc8e 100644 --- a/src/ioc/db/test/dbPutLinkTest.c +++ b/src/ioc/db/test/dbPutLinkTest.c @@ -585,9 +585,10 @@ void testJLink(void) testNumZ(3); testdbPutFieldFail(S_dbLib_badField, "j1.INP", DBF_STRING, "{\"z\":{\"fail\":5}}"); + testdbPutFieldFail(S_dbLib_badField, "j1.INP", DBF_STRING, "{\"z\":{\"good\":6}"); testdbPutFieldOk("j1.PROC", DBF_LONG, 1); testdbGetFieldEqual("j1.VAL", DBF_LONG, 4); - /* put failure in parsing stage doesn't modify link */ + /* put failures in parsing stage don't modify link */ testdbGetFieldEqual("j1.INP", DBF_STRING, "{\"z\":{\"good\":4}}"); testNumZ(3); @@ -601,7 +602,7 @@ void testJLink(void) MAIN(dbPutLinkTest) { - testPlan(301); + testPlan(302); testLinkParse(); testLinkFailParse(); testCADBSet();