diff --git a/src/corelib/io/qiodevice.cpp b/src/corelib/io/qiodevice.cpp index 53019e1ff4..51a574987e 100644 --- a/src/corelib/io/qiodevice.cpp +++ b/src/corelib/io/qiodevice.cpp @@ -833,7 +833,7 @@ qint64 QIODevice::read(char *data, qint64 maxSize) // In buffered mode, we try to fill up the QIODevice buffer before // we do anything else. // buffer is empty at this point, try to fill it - int bytesToBuffer = QIODEVICE_BUFFERSIZE; + const int bytesToBuffer = QIODEVICE_BUFFERSIZE; char *writePointer = d->buffer.reserve(bytesToBuffer); // Make sure the device is positioned correctly. @@ -1013,6 +1013,8 @@ QByteArray QIODevice::readAll() // flush internal read buffer if (!(d->openMode & Text) && !d->buffer.isEmpty()) { + if (d->buffer.size() >= INT_MAX) + return QByteArray(); result = d->buffer.readAll(); readBytes = result.size(); d->pos += readBytes; @@ -1031,6 +1033,8 @@ QByteArray QIODevice::readAll() } else { // Read it all in one go. // If resize fails, don't read anything. + if (readBytes + theSize - d->pos > INT_MAX) + return QByteArray(); result.resize(int(readBytes + theSize - d->pos)); readBytes += read(result.data() + readBytes, result.size() - readBytes); } diff --git a/src/corelib/io/qiodevice_p.h b/src/corelib/io/qiodevice_p.h index faf64e2cf1..132ab1cad2 100644 --- a/src/corelib/io/qiodevice_p.h +++ b/src/corelib/io/qiodevice_p.h @@ -84,13 +84,13 @@ public: first = buf; capacity = 0; } - int size() const { + qint64 size() const { return len; } bool isEmpty() const { return len == 0; } - void skip(int n) { + void skip(qint64 n) { if (n >= len) { clear(); } else { @@ -106,14 +106,14 @@ public: first++; return ch; } - int read(char* target, int size) { + int read(char* target, qint64 size) { int r = qMin(size, len); memcpy(target, first, r); len -= r; first += r; return r; } - int peek(char* target, int size) { + int peek(char* target, qint64 size) { int r = qMin(size, len); memcpy(target, first, r); return r; @@ -124,7 +124,7 @@ public: len += size; return writePtr; } - void chop(int size) { + void chop(qint64 size) { if (size >= len) { clear(); } else { @@ -136,7 +136,7 @@ public: clear(); return retVal; } - int readLine(char* target, int size) { + int readLine(char* target, qint64 size) { int r = qMin(size, len); char* eol = static_cast(memchr(first, '\n', r)); if (eol) @@ -158,7 +158,7 @@ public: len++; *first = c; } - void ungetBlock(const char* block, int size) { + void ungetBlock(const char* block, qint64 size) { if ((first - buf) < size) { // underflow, the existing valid data needs to move to the end of the (potentially bigger) buffer makeSpace(len + size, freeSpaceAtStart); @@ -191,7 +191,7 @@ private: private: // length of the unread data - int len; + qint64 len; // start of the unread data char* first; // the allocated buffer