@@ -514,7 +514,11 @@ PacketBufferHandle PacketBufferHandle::New(size_t aAvailableSize, uint16_t aRese
514
514
static_assert (PacketBuffer::kStructureSize == sizeof (PacketBuffer), " PacketBuffer size mismatch" );
515
515
static_assert (PacketBuffer::kStructureSize < UINT16_MAX, " Check for overflow more carefully" );
516
516
static_assert (SIZE_MAX >= INT_MAX, " Our additions might not fit in size_t" );
517
- static_assert (PacketBuffer::kMaxSizeWithoutReserve <= UINT32_MAX, " PacketBuffer may have size not fitting uint32_t" );
517
+ #if INET_CONFIG_ENABLE_TCP_ENDPOINT
518
+ static_assert (PacketBuffer::kLargeBufMaxSizeWithoutReserve <= UINT32_MAX, " Max size for Large payload buffers" );
519
+ static_assert (PacketBuffer::kMaxSizeWithoutReserve < PacketBuffer::kLargeBufMaxSizeWithoutReserve ,
520
+ " Large buffer configuration should be greater than the conventional buffer limit" );
521
+ #endif // INET_CONFIG_ENABLE_TCP_ENDPOINT
518
522
#if CHIP_SYSTEM_CONFIG_USE_LWIP
519
523
// LwIP based APIs have a maximum buffer size of UINT16_MAX. Ensure that
520
524
// limit is met during allocation.
@@ -525,13 +529,11 @@ PacketBufferHandle PacketBufferHandle::New(size_t aAvailableSize, uint16_t aRese
525
529
// When `aAvailableSize` fits in uint16_t (as tested below) and size_t is at least 32 bits (as asserted above),
526
530
// these additions will not overflow.
527
531
const size_t lAllocSize = aReservedSize + aAvailableSize;
528
- const size_t lBlockSize = PacketBuffer::kStructureSize + lAllocSize;
529
532
PacketBuffer * lPacket;
530
533
531
534
CHIP_SYSTEM_FAULT_INJECT (FaultInjection::kFault_PacketBufferNew , return PacketBufferHandle ());
532
535
533
- // TODO: Change the max to a lower value
534
- if (aAvailableSize > UINT32_MAX || lAllocSize > PacketBuffer::kMaxSizeWithoutReserve || lBlockSize > UINT32_MAX)
536
+ if (lAllocSize > PacketBuffer::kMaxAllocSize )
535
537
{
536
538
ChipLogError (chipSystemLayer, " PacketBuffer: allocation too large." );
537
539
return PacketBufferHandle ();
@@ -546,7 +548,6 @@ PacketBufferHandle PacketBufferHandle::New(size_t aAvailableSize, uint16_t aRese
546
548
547
549
#elif CHIP_SYSTEM_PACKETBUFFER_FROM_CHIP_POOL
548
550
549
- static_cast <void >(lBlockSize);
550
551
#if !CHIP_SYSTEM_CONFIG_NO_LOCKING && CHIP_SYSTEM_CONFIG_FREERTOS_LOCKING
551
552
if (!sBufferPoolMutex .isInitialized ())
552
553
{
@@ -566,6 +567,7 @@ PacketBufferHandle PacketBufferHandle::New(size_t aAvailableSize, uint16_t aRese
566
567
567
568
#elif CHIP_SYSTEM_PACKETBUFFER_FROM_CHIP_HEAP
568
569
570
+ const size_t lBlockSize = PacketBuffer::kStructureSize + lAllocSize;
569
571
lPacket = reinterpret_cast <PacketBuffer *>(chip::Platform::MemoryAlloc (lBlockSize));
570
572
SYSTEM_STATS_INCREMENT (chip::System::Stats::kSystemLayer_NumPacketBufs );
571
573
@@ -593,18 +595,15 @@ PacketBufferHandle PacketBufferHandle::New(size_t aAvailableSize, uint16_t aRese
593
595
PacketBufferHandle PacketBufferHandle::NewWithData (const void * aData, size_t aDataSize, size_t aAdditionalSize,
594
596
uint16_t aReservedSize)
595
597
{
596
- if (aDataSize > UINT16_MAX)
597
- {
598
- ChipLogError (chipSystemLayer, " PacketBuffer: allocation too large." );
599
- return PacketBufferHandle ();
600
- }
601
598
// Since `aDataSize` fits in uint16_t, the sum `aDataSize + aAdditionalSize` will not overflow.
602
599
// `New()` will only return a non-null buffer if the total allocation size does not overflow.
603
600
PacketBufferHandle buffer = New (aDataSize + aAdditionalSize, aReservedSize);
604
601
if (buffer.mBuffer != nullptr )
605
602
{
606
603
memcpy (buffer.mBuffer ->payload , aData, aDataSize);
607
604
#if CHIP_SYSTEM_CONFIG_USE_LWIP
605
+ // The VerifyOrDie() in the New() call catches buffer allocations greater
606
+ // than UINT16_MAX for LwIP based platforms.
608
607
buffer.mBuffer ->len = buffer.mBuffer ->tot_len = static_cast <uint16_t >(aDataSize);
609
608
#else
610
609
buffer.mBuffer ->len = buffer.mBuffer ->tot_len = aDataSize;
@@ -727,18 +726,20 @@ PacketBufferHandle PacketBufferHandle::CloneData() const
727
726
size_t originalDataSize = original->MaxDataLength ();
728
727
uint16_t originalReservedSize = original->ReservedSize ();
729
728
730
- if (originalDataSize + originalReservedSize > PacketBuffer::kMaxSizeWithoutReserve )
729
+ uint32_t maxSize = PacketBuffer::kMaxAllocSize ;
730
+
731
+ if (originalDataSize + originalReservedSize > maxSize)
731
732
{
732
733
// The original memory allocation may have provided a larger block than requested (e.g. when using a shared pool),
733
734
// and in particular may have provided a larger block than we are able to request from PackBufferHandle::New().
734
735
// It is a genuine error if that extra space has been used.
735
- if (originalReservedSize + original->DataLength () > PacketBuffer:: kMaxSizeWithoutReserve )
736
+ if (originalReservedSize + original->DataLength () > maxSize )
736
737
{
737
738
return PacketBufferHandle ();
738
739
}
739
740
// Otherwise, reduce the requested data size. This subtraction can not underflow because the above test
740
- // guarantees originalReservedSize <= PacketBuffer::kMaxSizeWithoutReserve .
741
- originalDataSize = PacketBuffer:: kMaxSizeWithoutReserve - originalReservedSize;
741
+ // guarantees originalReservedSize <= maxSize .
742
+ originalDataSize = maxSize - originalReservedSize;
742
743
}
743
744
744
745
PacketBufferHandle clone = PacketBufferHandle::New (originalDataSize, originalReservedSize);
0 commit comments