Skip to content

Commit 1098796

Browse files
bzbarsky-applepull[bot]
authored andcommitted
Add a private method on SystemPacketBuffer to find where its reserved space starts. (#23284)
Fixes #5372
1 parent fbe1b3a commit 1098796

File tree

2 files changed

+31
-17
lines changed

2 files changed

+31
-17
lines changed

src/system/SystemPacketBuffer.cpp

+23-17
Original file line numberDiff line numberDiff line change
@@ -133,9 +133,9 @@ void PacketBufferHandle::InternalRightSize()
133133
}
134134

135135
// Reallocate only if enough space will be saved.
136-
uint8_t * const start = reinterpret_cast<uint8_t *>(mBuffer) + PacketBuffer::kStructureSize;
137-
uint8_t * const payload = reinterpret_cast<uint8_t *>(mBuffer->payload);
138-
const uint16_t usedSize = static_cast<uint16_t>(payload - start + mBuffer->len);
136+
const uint8_t * const start = mBuffer->ReserveStart();
137+
const uint8_t * const payload = mBuffer->Start();
138+
const uint16_t usedSize = static_cast<uint16_t>(payload - start + mBuffer->len);
139139
if (usedSize + kRightSizingThreshold > mBuffer->alloc_size)
140140
{
141141
return;
@@ -149,14 +149,14 @@ void PacketBufferHandle::InternalRightSize()
149149
return;
150150
}
151151

152-
uint8_t * const newStart = reinterpret_cast<uint8_t *>(newBuffer) + PacketBuffer::kStructureSize;
152+
uint8_t * const newStart = newBuffer->ReserveStart();
153153
newBuffer->next = nullptr;
154154
newBuffer->payload = newStart + (payload - start);
155155
newBuffer->tot_len = mBuffer->tot_len;
156156
newBuffer->len = mBuffer->len;
157157
newBuffer->ref = 1;
158158
newBuffer->alloc_size = static_cast<uint16_t>(usedSize);
159-
memcpy(reinterpret_cast<uint8_t *>(newBuffer) + PacketBuffer::kStructureSize, start, usedSize);
159+
memcpy(newStart, start, usedSize);
160160

161161
PacketBuffer::Free(mBuffer);
162162
mBuffer = newBuffer;
@@ -193,7 +193,7 @@ void PacketBufferHandle::InternalRightSize()
193193

194194
void PacketBuffer::SetStart(uint8_t * aNewStart)
195195
{
196-
uint8_t * const kStart = reinterpret_cast<uint8_t *>(this) + kStructureSize;
196+
uint8_t * const kStart = ReserveStart();
197197
uint8_t * const kEnd = kStart + this->AllocSize();
198198

199199
if (aNewStart < kStart)
@@ -236,9 +236,7 @@ void PacketBuffer::SetDataLength(uint16_t aNewLen, PacketBuffer * aChainHead)
236236

237237
uint16_t PacketBuffer::MaxDataLength() const
238238
{
239-
const uint8_t * const kStart = reinterpret_cast<const uint8_t *>(this) + kStructureSize;
240-
const ptrdiff_t kDelta = static_cast<uint8_t *>(this->payload) - kStart;
241-
return static_cast<uint16_t>(this->AllocSize() - kDelta);
239+
return static_cast<uint16_t>(AllocSize() - ReservedSize());
242240
}
243241

244242
uint16_t PacketBuffer::AvailableDataLength() const
@@ -248,10 +246,19 @@ uint16_t PacketBuffer::AvailableDataLength() const
248246

249247
uint16_t PacketBuffer::ReservedSize() const
250248
{
251-
// Cast to size_t is safe because this->payload always points to "after"
252-
// this.
253-
const size_t kDelta = static_cast<size_t>(static_cast<uint8_t *>(this->payload) - reinterpret_cast<const uint8_t *>(this));
254-
return static_cast<uint16_t>(kDelta - kStructureSize);
249+
// Cast to uint16_t is safe because Start() always points to "after"
250+
// ReserveStart(). At least when the payload is stored inline.
251+
return static_cast<uint16_t>(Start() - ReserveStart());
252+
}
253+
254+
uint8_t * PacketBuffer::ReserveStart()
255+
{
256+
return reinterpret_cast<uint8_t *>(this) + kStructureSize;
257+
}
258+
259+
const uint8_t * PacketBuffer::ReserveStart() const
260+
{
261+
return reinterpret_cast<const uint8_t *>(this) + kStructureSize;
255262
}
256263

257264
void PacketBuffer::AddToEnd(PacketBufferHandle && aPacketHandle)
@@ -282,7 +289,7 @@ void PacketBuffer::AddToEnd(PacketBufferHandle && aPacketHandle)
282289

283290
void PacketBuffer::CompactHead()
284291
{
285-
uint8_t * const kStart = reinterpret_cast<uint8_t *>(this) + kStructureSize;
292+
uint8_t * const kStart = ReserveStart();
286293

287294
if (this->payload != kStart)
288295
{
@@ -505,7 +512,7 @@ PacketBufferHandle PacketBufferHandle::New(size_t aAvailableSize, uint16_t aRese
505512
return PacketBufferHandle();
506513
}
507514

508-
lPacket->payload = reinterpret_cast<uint8_t *>(lPacket) + PacketBuffer::kStructureSize + aReservedSize;
515+
lPacket->payload = lPacket->ReserveStart() + aReservedSize;
509516
lPacket->len = lPacket->tot_len = 0;
510517
lPacket->next = nullptr;
511518
lPacket->ref = 1;
@@ -669,8 +676,7 @@ PacketBufferHandle PacketBufferHandle::CloneData() const
669676
return PacketBufferHandle();
670677
}
671678
clone.mBuffer->tot_len = clone.mBuffer->len = original->len;
672-
memcpy(reinterpret_cast<uint8_t *>(clone.mBuffer) + PacketBuffer::kStructureSize,
673-
reinterpret_cast<uint8_t *>(original) + PacketBuffer::kStructureSize, originalDataSize + originalReservedSize);
679+
memcpy(clone->ReserveStart(), original->ReserveStart(), originalDataSize + originalReservedSize);
674680

675681
if (cloneHead.IsNull())
676682
{

src/system/SystemPacketBuffer.h

+8
Original file line numberDiff line numberDiff line change
@@ -383,6 +383,14 @@ class DLL_EXPORT PacketBuffer : private pbuf
383383
void Clear();
384384
void SetDataLength(uint16_t aNewLen, PacketBuffer * aChainHead);
385385

386+
/**
387+
* Get a pointer to the start of the reserved space (which comes before the
388+
* payload). The actual reserved space is the ReservedSize() bytes starting
389+
* at this pointer.
390+
*/
391+
uint8_t * ReserveStart();
392+
const uint8_t * ReserveStart() const;
393+
386394
friend class PacketBufferHandle;
387395
friend class ::PacketBufferTest;
388396
};

0 commit comments

Comments
 (0)