Skip to content

Commit 479edd9

Browse files
committed
Fix GCDAsyncSocketPreBuffer availableSpace bugs that lead to access violation.
It's easy to see the bug by putting the read pointer slightly behind the write pointer both near the end of the buffer.
1 parent 15126e5 commit 479edd9

File tree

1 file changed

+4
-4
lines changed

1 file changed

+4
-4
lines changed

GCD/GCDAsyncSocket.m

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -385,7 +385,7 @@ - (void)dealloc
385385

386386
- (void)ensureCapacityForWrite:(size_t)numBytes
387387
{
388-
size_t availableSpace = preBufferSize - (writePointer - readPointer);
388+
size_t availableSpace = [self availableSpace];
389389

390390
if (numBytes > availableSpace)
391391
{
@@ -418,7 +418,7 @@ - (uint8_t *)readBuffer
418418
- (void)getReadBuffer:(uint8_t **)bufferPtr availableBytes:(size_t *)availableBytesPtr
419419
{
420420
if (bufferPtr) *bufferPtr = readPointer;
421-
if (availableBytesPtr) *availableBytesPtr = writePointer - readPointer;
421+
if (availableBytesPtr) *availableBytesPtr = [self availableBytes];
422422
}
423423

424424
- (void)didRead:(size_t)bytesRead
@@ -435,7 +435,7 @@ - (void)didRead:(size_t)bytesRead
435435

436436
- (size_t)availableSpace
437437
{
438-
return preBufferSize - (writePointer - readPointer);
438+
return preBufferSize - (writePointer - preBuffer);
439439
}
440440

441441
- (uint8_t *)writeBuffer
@@ -446,7 +446,7 @@ - (uint8_t *)writeBuffer
446446
- (void)getWriteBuffer:(uint8_t **)bufferPtr availableSpace:(size_t *)availableSpacePtr
447447
{
448448
if (bufferPtr) *bufferPtr = writePointer;
449-
if (availableSpacePtr) *availableSpacePtr = preBufferSize - (writePointer - readPointer);
449+
if (availableSpacePtr) *availableSpacePtr = [self availableSpace];
450450
}
451451

452452
- (void)didWrite:(size_t)bytesWritten

0 commit comments

Comments
 (0)