bounded empty maps and arrays might actually be working
diff --git a/src/qcbor_decode.c b/src/qcbor_decode.c
index 6f60ef6..e5a4cab 100644
--- a/src/qcbor_decode.c
+++ b/src/qcbor_decode.c
@@ -117,7 +117,7 @@
}
-static inline size_t
+static inline uint32_t
DecodeNesting_GetMapOrArrayStart(const QCBORDecodeNesting *pNesting)
{
return pNesting->pCurrentBounded->u.ma.uStartOffset;
@@ -1344,6 +1344,7 @@
uReturn = QCBOR_ERR_BAD_BREAK;
goto Done;
}
+
/* It was a break in an indefinite length map / array */
}
@@ -2382,6 +2383,10 @@
{
QCBORError uReturn;
+ if(pMe->uLastError != QCBOR_SUCCESS) {
+ return pMe->uLastError;
+ }
+
QCBORDecodeNesting SaveNesting = pMe->nesting; // TODO: refactor?
uint64_t uFoundItemBitMap = 0;
@@ -2398,10 +2403,11 @@
// It is an empty bounded array or map
if(pItemArray->uLabelType == QCBOR_TYPE_NONE) {
// Just trying to find the end of the map or array
+ pMe->uMapEndOffsetCache = DecodeNesting_GetMapOrArrayStart(&(pMe->nesting));
uReturn = QCBOR_SUCCESS;
- pMe->uMapEndOffsetCache = (uint32_t)DecodeNesting_GetMapOrArrayStart(&(pMe->nesting));
} else {
- // Nothing is ever found in an empty array or map
+ // Nothing is ever found in an empty array or map. All items
+ // are marked as not found below.
uReturn = QCBOR_SUCCESS;
}
goto Done;
@@ -2825,6 +2831,11 @@
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
+ pMe->nesting.pCurrent->u.ma.uCountCursor++;
+ }
// Special case to increment nesting level for zero-length maps and arrays entered in bounded mode.
DecodeNesting_Descend(&(pMe->nesting), uType);
}
@@ -2836,13 +2847,13 @@
pMe->uLastError = (uint8_t)uErr;
- DecodeNesting_Print(&(pMe->nesting), &(pMe->InBuf), "EnterMapModeDone");
+ DecodeNesting_Print(&(pMe->nesting), &(pMe->InBuf), "EnterMapModeDone");
}
/*
- This is for exiting a level that is a bounded map, array or bstr
- wrapped CBOR. It is the work common to these.
+ This is the common work for exiting a level that is a bounded map, array or bstr
+ wrapped CBOR.
One chunk of work is to set up the pre-order traversal so it is at
the item just after the bounded map, array or bstr that is being
@@ -3165,12 +3176,12 @@
return;
}
- QCBORError nError;
+ QCBORError uError;
QCBORItem Item;
- nError = QCBORDecode_GetNext(pMe, &Item);
- if(nError != QCBOR_SUCCESS) {
- pMe->uLastError = (uint8_t)nError;
+ uError = QCBORDecode_GetNext(pMe, &Item);
+ if(uError != QCBOR_SUCCESS) {
+ pMe->uLastError = (uint8_t)uError;
return;
}