more bounded mode fixes
diff --git a/src/qcbor_decode.c b/src/qcbor_decode.c
index e5a4cab..673a14a 100644
--- a/src/qcbor_decode.c
+++ b/src/qcbor_decode.c
@@ -2383,9 +2383,9 @@
{
QCBORError uReturn;
- if(pMe->uLastError != QCBOR_SUCCESS) {
- return pMe->uLastError;
- }
+ if(pMe->uLastError != QCBOR_SUCCESS) {
+ return pMe->uLastError;
+ }
QCBORDecodeNesting SaveNesting = pMe->nesting; // TODO: refactor?
@@ -2446,6 +2446,7 @@
/* See if item has one of the labels that are of interest */
int nIndex;
QCBORItem *pIterator;
+ bool bMatched = false;
for(pIterator = pItemArray, nIndex = 0; pIterator->uLabelType != 0; pIterator++, nIndex++) {
if(MatchLabel(Item, *pIterator)) {
/* A label match has been found */
@@ -2465,19 +2466,19 @@
if(puOffset) {
*puOffset = uOffset;
}
- } else {
- /*
- Call the callback on unmatched labels.
- (It is tempting to do duplicate detection here, but that would
- require dynamic memory allocation because the number of labels
- that might be encountered is unbounded.)
- */
- if(pfCallback) {
- uReturn = (*pfCallback)(pCBContext, &Item);
- if(uReturn != QCBOR_SUCCESS) {
- goto Done;
- }
- }
+ bMatched = true;
+ }
+ }
+ if(!bMatched && pfCallback != NULL) {
+ /*
+ Call the callback on unmatched labels.
+ (It is tempting to do duplicate detection here, but that would
+ require dynamic memory allocation because the number of labels
+ that might be encountered is unbounded.)
+ */
+ uReturn = (*pfCallback)(pCBContext, &Item);
+ if(uReturn != QCBOR_SUCCESS) {
+ goto Done;
}
}
@@ -2501,16 +2502,13 @@
/* Cast OK because encoded CBOR is limited to UINT32_MAX */
pMe->uMapEndOffsetCache = (uint32_t)uEndOffset;
- /* For all items not found, set the data type to QCBOR_TYPE_NONE */
-Done:
- {int i;
- QCBORItem *pIterator;
- for(pIterator = pItemArray, i = 0; pIterator->uLabelType != 0; pIterator++, i++) {
+ Done:
+ /* For all items not found, set the data type to QCBOR_TYPE_NONE */
+ for(int i = 0; pItemArray[i].uLabelType != 0; i++) {
if(!(uFoundItemBitMap & (0x01ULL << i))) {
- pIterator->uDataType = QCBOR_TYPE_NONE;
+ pItemArray[i].uDataType = QCBOR_TYPE_NONE;
}
}
- }
DecodeNesting_RestoreFromMapSearch(&(pMe->nesting), &SaveNesting);
@@ -2812,6 +2810,8 @@
// Semi-private function
void QCBORDecode_EnterBoundedMapOrArray(QCBORDecodeContext *pMe, uint8_t uType)
{
+ QCBORError uErr;
+
/* Must only be called on maps and arrays. */
if(pMe->uLastError != QCBOR_SUCCESS) {
// Already in error state; do nothing.
@@ -2820,20 +2820,20 @@
/* Get the data item that is the map that is being searched */
QCBORItem Item;
- pMe->uLastError = (uint8_t)QCBORDecode_GetNext(pMe, &Item);
- if(pMe->uLastError != QCBOR_SUCCESS) {
- return;
+ uErr = QCBORDecode_GetNext(pMe, &Item);
+ if(uErr != QCBOR_SUCCESS) {
+ goto Done;
}
if(Item.uDataType != uType) {
- pMe->uLastError = QCBOR_ERR_UNEXPECTED_TYPE;
- return;
+ uErr = QCBOR_ERR_UNEXPECTED_TYPE;
+ goto Done;
}
- const bool bIsEmpty = Item.uNestingLevel == Item.uNextNestLevel;
+ const bool bIsEmpty = (Item.uNestingLevel == Item.uNextNestLevel);
if(bIsEmpty) {
if(DecodeNesting_IsCurrentDefiniteLength(&(pMe->nesting))) {
// Undo decrement done by QCBORDecode_GetNext() so the the
- // the decrement when exiting the map / array works correctly
+ // the decrement when exiting the map/array works correctly
pMe->nesting.pCurrent->u.ma.uCountCursor++;
}
// Special case to increment nesting level for zero-length maps and arrays entered in bounded mode.
@@ -2842,12 +2842,11 @@
pMe->uMapEndOffsetCache = MAP_OFFSET_CACHE_INVALID;
- QCBORError uErr = DecodeNesting_EnterBoundedMapOrArray(&(pMe->nesting), bIsEmpty,
- UsefulInputBuf_Tell(&(pMe->InBuf)));
+ uErr = DecodeNesting_EnterBoundedMapOrArray(&(pMe->nesting), bIsEmpty,
+ UsefulInputBuf_Tell(&(pMe->InBuf)));
+Done:
pMe->uLastError = (uint8_t)uErr;
-
- DecodeNesting_Print(&(pMe->nesting), &(pMe->InBuf), "EnterMapModeDone");
}
@@ -2958,6 +2957,10 @@
uint8_t uTagRequirement,
UsefulBufC *pBstr)
{
+ if(pBstr) {
+ *pBstr = NULLUsefulBufC;
+ }
+
if(pMe->uLastError != QCBOR_SUCCESS) {
// Already in error state; do nothing.
return pMe->uLastError;
@@ -3019,8 +3022,8 @@
Public function, see header qcbor/qcbor_decode.h file
*/
void QCBORDecode_EnterBstrWrapped(QCBORDecodeContext *pMe,
- uint8_t uTagRequirement,
- UsefulBufC *pBstr)
+ uint8_t uTagRequirement,
+ UsefulBufC *pBstr)
{
if(pMe->uLastError != QCBOR_SUCCESS) {
// Already in error state; do nothing.