diff options
author | Oswald Buddenhagen <oswald.buddenhagen@nokia.com> | 2009-11-02 21:30:09 (GMT) |
---|---|---|
committer | Oswald Buddenhagen <oswald.buddenhagen@nokia.com> | 2009-11-03 12:43:01 (GMT) |
commit | f080d232ef072976b28ca4b448dcb210b5941b2e (patch) | |
tree | 34d585105a58d37467dcc5c03b738ad24b6bff14 | |
parent | 20cfe1e790295254370cf472df39813f864de7ea (diff) | |
download | Qt-f080d232ef072976b28ca4b448dcb210b5941b2e.zip Qt-f080d232ef072976b28ca4b448dcb210b5941b2e.tar.gz Qt-f080d232ef072976b28ca4b448dcb210b5941b2e.tar.bz2 |
fix canReadLine() erroneously returning true
the indexOf() call did not consider actualReadBufferSize and thus
scanned uninitialized memory for newlines.
Reviewed-by: phartman
-rw-r--r-- | src/corelib/tools/qringbuffer_p.h | 27 | ||||
-rw-r--r-- | src/network/socket/qlocalsocket_win.cpp | 3 |
2 files changed, 29 insertions, 1 deletions
diff --git a/src/corelib/tools/qringbuffer_p.h b/src/corelib/tools/qringbuffer_p.h index c44346c..7c766cb 100644 --- a/src/corelib/tools/qringbuffer_p.h +++ b/src/corelib/tools/qringbuffer_p.h @@ -287,6 +287,33 @@ public: return -1; } + inline int indexOf(char c, int maxLength) const { + int index = 0; + int remain = qMin(size(), maxLength); + for (int i = 0; remain && i < buffers.size(); ++i) { + int start = 0; + int end = buffers.at(i).size(); + + if (i == 0) + start = head; + if (i == tailBuffer) + end = tail; + if (remain < end - start) { + end = start + remain; + remain = 0; + } else { + remain -= end - start; + } + const char *ptr = buffers.at(i).data() + start; + for (int j = start; j < end; ++j) { + if (*ptr++ == c) + return index; + ++index; + } + } + return -1; + } + inline int read(char *data, int maxLength) { int bytesToRead = qMin(size(), maxLength); int readSoFar = 0; diff --git a/src/network/socket/qlocalsocket_win.cpp b/src/network/socket/qlocalsocket_win.cpp index 8a745ab..d812d88 100644 --- a/src/network/socket/qlocalsocket_win.cpp +++ b/src/network/socket/qlocalsocket_win.cpp @@ -363,7 +363,8 @@ bool QLocalSocket::canReadLine() const Q_D(const QLocalSocket); if (state() != ConnectedState) return false; - return (d->readBuffer.indexOf('\n') != -1 || QIODevice::canReadLine()); + return (QIODevice::canReadLine() + || d->readBuffer.indexOf('\n', d->actualReadBufferSize) != -1); } void QLocalSocket::close() |