Skip to content

Commit d50544e

Browse files
committed
Merge pull request robbiehanson#205 from talko/availspacebugs
Failing unit test and fix for buffer overrun access violation in GCDAsyncSocketPreBuffer.
2 parents 42fa5c9 + 479edd9 commit d50544e

File tree

2 files changed

+27
-10
lines changed

2 files changed

+27
-10
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

GCD/Xcode/TestPreBuffer/Shared/TestPreBuffer.m

Lines changed: 23 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ + (void)start
5959
// Run unit tests
6060

6161
[self test_preBuffer];
62-
62+
6363
// Setup benchmarks.
6464
//
6565
// We're going to test a common pattern within GCDAsyncSocket, which is:
@@ -89,7 +89,7 @@ + (void)test_preBuffer
8989
// Test capacity, and initial size methods
9090

9191
size_t capacity = [preBuffer availableSpace];
92-
92+
9393
NSAssert([preBuffer availableSpace] >= 1024, @"1A");
9494
NSAssert([preBuffer availableBytes] == 0, @"1B");
9595

@@ -101,7 +101,7 @@ + (void)test_preBuffer
101101
writePointer1 = [preBuffer writeBuffer];
102102
[preBuffer didWrite:512];
103103
writePointer2 = [preBuffer writeBuffer];
104-
104+
105105
NSAssert(writePointer2 - writePointer1 == 512, @"2A");
106106
NSAssert([preBuffer availableBytes] == 512, @"2B");
107107

@@ -113,15 +113,19 @@ + (void)test_preBuffer
113113
readPointer1 = [preBuffer readBuffer];
114114
[preBuffer didRead:256];
115115
readPointer2 = [preBuffer readBuffer];
116-
116+
117117
NSAssert(readPointer2 - readPointer1 == 256, @"3A");
118118
NSAssert([preBuffer availableBytes] == 256, @"3B");
119119

120120
[preBuffer didRead:256];
121121

122122
NSAssert([preBuffer availableBytes] == 0, @"4A");
123123
NSAssert([preBuffer availableSpace] == capacity, @"4B");
124-
124+
125+
// At this point, the buffer should have reset
126+
NSAssert([preBuffer readBuffer] == [preBuffer writeBuffer], @"4C");
127+
NSAssert([preBuffer availableSpace] == 1024, @"4D");
128+
125129
// Test write and read
126130

127131
char *str = "test";
@@ -140,7 +144,20 @@ + (void)test_preBuffer
140144
NSAssert([preBuffer availableSpace] >= (capacity * 2), @"6A");
141145
NSAssert([preBuffer availableBytes] == strLen, @"6B");
142146
NSAssert(memcmp([preBuffer readBuffer], str, strLen) == 0, @"6C");
143-
147+
148+
// Test available space
149+
[preBuffer reset];
150+
size_t availableSpace = [preBuffer availableSpace];
151+
152+
// Make sure the available space is correct if we write all but 1 byte of our available space
153+
size_t writeCount = availableSpace - 1;
154+
[preBuffer didWrite:writeCount];
155+
NSAssert([preBuffer availableSpace] == 1, @"7A");
156+
157+
// Make sure it doesn't change if we read some, but not all, of the data
158+
[preBuffer didRead:writeCount - 1];
159+
NSAssert([preBuffer availableSpace] == 1, @"7B");
160+
144161
NSLog(@"%@: passed", NSStringFromSelector(_cmd));
145162
}
146163

0 commit comments

Comments
 (0)