@@ -290,7 +290,7 @@ CHIP_ERROR TLVReader::Get(double & v) const
290
290
return CHIP_NO_ERROR;
291
291
}
292
292
293
- CHIP_ERROR TLVReader::Get (ByteSpan & v)
293
+ CHIP_ERROR TLVReader::Get (ByteSpan & v) const
294
294
{
295
295
const uint8_t * val;
296
296
ReturnErrorOnFailure (GetDataPtr (val));
@@ -304,7 +304,7 @@ constexpr int kUnicodeInformationSeparator1 = 0x1F;
304
304
constexpr size_t kMaxLocalizedStringIdentifierLen = 2 * sizeof (LocalizedStringIdentifier);
305
305
} // namespace
306
306
307
- CHIP_ERROR TLVReader::Get (CharSpan & v)
307
+ CHIP_ERROR TLVReader::Get (CharSpan & v) const
308
308
{
309
309
if (!TLVTypeIsUTF8String (ElementType ()))
310
310
{
@@ -460,32 +460,22 @@ CHIP_ERROR TLVReader::DupString(char *& buf)
460
460
return err;
461
461
}
462
462
463
- CHIP_ERROR TLVReader::GetDataPtr (const uint8_t *& data)
463
+ CHIP_ERROR TLVReader::GetDataPtr (const uint8_t *& data) const
464
464
{
465
- CHIP_ERROR err;
466
-
467
- if (!TLVTypeIsString (ElementType ()))
468
- return CHIP_ERROR_WRONG_TLV_TYPE;
465
+ VerifyOrReturnError (TLVTypeIsString (ElementType ()), CHIP_ERROR_WRONG_TLV_TYPE);
469
466
470
467
if (GetLength () == 0 )
471
468
{
472
469
data = nullptr ;
473
470
return CHIP_NO_ERROR;
474
471
}
475
472
476
- err = EnsureData (CHIP_ERROR_TLV_UNDERRUN);
477
- if (err != CHIP_NO_ERROR)
478
- return err;
479
-
480
473
uint32_t remainingLen = static_cast <decltype (mMaxLen )>(mBufEnd - mReadPoint );
481
474
482
475
// Verify that the entirety of the data is available in the buffer.
483
476
// Note that this may not be possible if the reader is reading from a chain of buffers.
484
- if (remainingLen < static_cast <uint32_t >(mElemLenOrVal ))
485
- return CHIP_ERROR_TLV_UNDERRUN;
486
-
477
+ VerifyOrReturnError (remainingLen >= static_cast <uint32_t >(mElemLenOrVal ), CHIP_ERROR_TLV_UNDERRUN);
487
478
data = mReadPoint ;
488
-
489
479
return CHIP_NO_ERROR;
490
480
}
491
481
@@ -576,20 +566,19 @@ CHIP_ERROR TLVReader::VerifyEndOfContainer()
576
566
577
567
CHIP_ERROR TLVReader::Next ()
578
568
{
579
- CHIP_ERROR err ;
580
- TLVElementType elemType = ElementType ( );
569
+ ReturnErrorOnFailure ( Skip ()) ;
570
+ ReturnErrorOnFailure ( ReadElement () );
581
571
582
- err = Skip ();
583
- if (err != CHIP_NO_ERROR)
584
- return err;
572
+ TLVElementType elemType = ElementType ();
585
573
586
- err = ReadElement ();
587
- if (err != CHIP_NO_ERROR)
588
- return err;
574
+ VerifyOrReturnError (elemType != TLVElementType::EndOfContainer, CHIP_END_OF_TLV);
589
575
590
- elemType = ElementType ();
591
- if (elemType == TLVElementType::EndOfContainer)
592
- return CHIP_END_OF_TLV;
576
+ // Ensure that GetDataPtr calls can be called immediately after Next, so
577
+ // that `Get(ByteSpan&)` does not need to advance buffers and just works
578
+ if (TLVTypeIsString (elemType) && (GetLength () != 0 ))
579
+ {
580
+ ReturnErrorOnFailure (EnsureData (CHIP_ERROR_TLV_UNDERRUN));
581
+ }
593
582
594
583
return CHIP_NO_ERROR;
595
584
}
0 commit comments