fix JSON errors when reading empty array links

This commit is contained in:
2022-07-27 09:58:09 +02:00
parent 0caa5a045c
commit 96fe9306c7
2 changed files with 20 additions and 4 deletions

View File

@@ -27,6 +27,7 @@
#include "dbFldTypes.h"
#include "dbLink.h"
#include "link.h"
#include "errlog.h"
/**************************** Convert functions ****************************/
@@ -178,17 +179,23 @@ static long dbConstLoadLS(struct link *plink, char *pbuffer, epicsUInt32 size,
epicsUInt32 *plen)
{
const char *pstr = plink->value.constantStr;
long status;
if (!pstr)
return S_db_badField;
return dbLSConvertJSON(pstr, pbuffer, size, plen);
status = dbLSConvertJSON(pstr, pbuffer, size, plen);
if (status)
errlogPrintf("... while parsing link %s.%s %s\n",
plink->precord->name, dbLinkFieldName(plink), pstr);
return status;
}
static long dbConstLoadArray(struct link *plink, short dbrType, void *pbuffer,
long *pnReq)
{
const char *pstr = plink->value.constantStr;
long status;
if (!pstr)
return S_db_badField;
@@ -197,7 +204,11 @@ static long dbConstLoadArray(struct link *plink, short dbrType, void *pbuffer,
if (dbrType == DBF_MENU || dbrType == DBF_ENUM || dbrType == DBF_DEVICE)
dbrType = DBF_USHORT;
return dbPutConvertJSON(pstr, dbrType, pbuffer, pnReq);
status = dbPutConvertJSON(pstr, dbrType, pbuffer, pnReq);
if (status)
errlogPrintf("... while parsing link %s.%s %s\n",
plink->precord->name, dbLinkFieldName(plink), pstr);
return status;
}
static long dbConstGetNelements(const struct link *plink, long *nelements)

View File

@@ -162,6 +162,11 @@ long dbPutConvertJSON(const char *json, short dbrType,
if(INVALID_DB_REQ(dbrType))
return S_db_badDbrtype;
if (!jlen) {
*pnRequest = 0;
return 0;
}
parser->depth = 0;
parser->dbrType = dbrType;
parser->dbrSize = dbValueSize(dbrType);
@@ -186,7 +191,7 @@ long dbPutConvertJSON(const char *json, short dbrType,
case yajl_status_error: {
unsigned char *err = yajl_get_error(yh, 1,
(const unsigned char *) json, jlen);
fprintf(stderr, "dbConvertJSON: %s\n", err);
errlogPrintf("dbConvertJSON: %s\n", err);
yajl_free_error(yh, err);
}
/* fall through */
@@ -242,7 +247,7 @@ long dbLSConvertJSON(const char *json, char *pdest, epicsUInt32 size,
case yajl_status_error: {
unsigned char *err = yajl_get_error(yh, 1,
(const unsigned char *) json, jlen);
fprintf(stderr, "dbLoadLS_JSON: %s\n", err);
errlogPrintf("dbLoadLS_JSON: %s\n", err);
yajl_free_error(yh, err);
}
/* fall through */