Fixes for maps-as-arrays mode and unusual map labels (#228)
bug fix: QCBOR_DECODE_MODE_MAP_AS_ARRAY didn't work with indefinite-length maps
bug fix: QCBOR_DECODE_MODE_MAP_AS_ARRAY didn't work with QCBORDecode_EnterArray() and QCBORDecode_GetArray().
Add lots of testing for QCBOR_DECODE_MODE_MAP_AS_ARRAY including testing with unusual map labels like NaN floating point, maps, tag data items.
* Fixes for maps-as-arrays mode and unusual map labels
* Tidyness
* Test #ifdef fan out
* tidyness
---------
Co-authored-by: Laurence Lundblade <lgl@securitytheory.com>
diff --git a/src/qcbor_decode.c b/src/qcbor_decode.c
index 74465d0..fc34304 100644
--- a/src/qcbor_decode.c
+++ b/src/qcbor_decode.c
@@ -372,7 +372,12 @@
return false;
}
- if(pNesting->pCurrentBounded->uLevelType != uType) {
+ uint8_t uItemDataType = pNesting->pCurrentBounded->uLevelType;
+ if(uItemDataType == QCBOR_TYPE_MAP_AS_ARRAY) {
+ uItemDataType = QCBOR_TYPE_ARRAY;
+ }
+
+ if(uItemDataType != uType) {
return false;
}
@@ -1745,15 +1750,18 @@
* strings.
*/
if(pDecodedItem->uDataType == QCBOR_TYPE_MAP) {
- if(pDecodedItem->val.uCount > QCBOR_MAX_ITEMS_IN_ARRAY/2) {
- uReturn = QCBOR_ERR_ARRAY_DECODE_TOO_LONG;
- goto Done;
- }
pDecodedItem->uDataType = QCBOR_TYPE_MAP_AS_ARRAY;
- /* Cast is safe because of check against QCBOR_MAX_ITEMS_IN_ARRAY/2.
- * Cast is needed because of integer promotion.
- */
- pDecodedItem->val.uCount = (uint16_t)(pDecodedItem->val.uCount * 2);
+ if(pDecodedItem->val.uCount != UINT16_MAX) {
+ /* Adjust definite-length map item count */
+ if(pDecodedItem->val.uCount > QCBOR_MAX_ITEMS_IN_ARRAY/2) {
+ uReturn = QCBOR_ERR_ARRAY_DECODE_TOO_LONG;
+ goto Done;
+ }
+ /* Cast is safe because of check against QCBOR_MAX_ITEMS_IN_ARRAY/2.
+ * Cast is needed because of integer promotion.
+ */
+ pDecodedItem->val.uCount = (uint16_t)(pDecodedItem->val.uCount * 2);
+ }
}
}
@@ -3571,7 +3579,12 @@
return;
}
- if(pItem->uDataType != uType) {
+ uint8_t uItemDataType = pItem->uDataType;
+ if(uItemDataType == QCBOR_TYPE_MAP_AS_ARRAY) {
+ uItemDataType = QCBOR_TYPE_ARRAY;
+ }
+
+ if(uItemDataType != uType) {
pMe->uLastError = QCBOR_ERR_UNEXPECTED_TYPE;
return;
}
@@ -4056,7 +4069,12 @@
if(uErr != QCBOR_SUCCESS) {
goto Done;
}
- if(Item.uDataType != uType) {
+
+ uint8_t uItemDataType = Item.uDataType;
+ if(uItemDataType == QCBOR_TYPE_MAP_AS_ARRAY ) {
+ uItemDataType = QCBOR_TYPE_ARRAY;
+ }
+ if(uItemDataType != uType) {
uErr = QCBOR_ERR_UNEXPECTED_TYPE;
goto Done;
}