From f47bb65958fa3768c167666a160c5d08c946da24 Mon Sep 17 00:00:00 2001 From: Nicolas Bachschmidt Date: Thu, 3 Dec 2015 21:21:52 +0100 Subject: [PATCH] Fix a bug in CFReadStreamGetBuffer for data streams cf http://openradar.me/5177598 --- CoreFoundation/Stream.subproj/CFConcreteStreams.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/CoreFoundation/Stream.subproj/CFConcreteStreams.c b/CoreFoundation/Stream.subproj/CFConcreteStreams.c index 3bb33d981e..b3b924cb93 100644 --- a/CoreFoundation/Stream.subproj/CFConcreteStreams.c +++ b/CoreFoundation/Stream.subproj/CFConcreteStreams.c @@ -592,21 +592,23 @@ static CFIndex dataRead(CFReadStreamRef stream, UInt8 *buffer, CFIndex bufferLen static const UInt8 *dataGetBuffer(CFReadStreamRef stream, CFIndex maxBytesToRead, CFIndex *numBytesRead, CFStreamError *error, Boolean *atEOF, void *info) { _CFReadDataStreamContext *dataCtxt = (_CFReadDataStreamContext *)info; - const UInt8 *bytes = CFDataGetBytePtr(dataCtxt->data); - if (dataCtxt->loc - bytes > maxBytesToRead) { + const UInt8 *bytePtr = CFDataGetBytePtr(dataCtxt->data); + CFIndex length = CFDataGetLength(dataCtxt->data); + CFIndex bytesToRead = bytePtr + length - dataCtxt->loc; + if (bytesToRead > maxBytesToRead) { *numBytesRead = maxBytesToRead; *atEOF = FALSE; } else { - *numBytesRead = dataCtxt->loc - bytes; + *numBytesRead = bytesToRead; *atEOF = TRUE; } error->error = 0; - bytes = dataCtxt->loc; + const UInt8 *buffer = dataCtxt->loc; dataCtxt->loc += *numBytesRead; if (dataCtxt->scheduled && !*atEOF) { CFReadStreamSignalEvent(stream, kCFStreamEventHasBytesAvailable, NULL); } - return bytes; + return buffer; } static Boolean dataCanRead(CFReadStreamRef stream, void *info) {