diff options
author | Alex Trotsenko <alex1973tr@gmail.com> | 2015-09-11 12:15:03 +0300 |
---|---|---|
committer | Alex Trotsenko <alex1973tr@gmail.com> | 2015-10-27 18:24:34 +0000 |
commit | 1e32ade79ced64597ef4148f16e0d8a329733c4e (patch) | |
tree | 443c995629abb8db88a9d53b00af365f72df218b /src/corelib/io | |
parent | 33486e0ae7d40045029f9e24bebdf7a6829f756c (diff) |
QIODevice: fix interleaving read() and write() in text mode under Windows
Skip the correct number of bytes in the read buffer when expanding '\n'
into "\r\n" upon writing.
Change-Id: I5b01fc47c330dee5c83001abf0acd7d63d790b96
Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@theqtcompany.com>
Diffstat (limited to 'src/corelib/io')
-rw-r--r-- | src/corelib/io/qiodevice.cpp | 7 |
1 files changed, 4 insertions, 3 deletions
diff --git a/src/corelib/io/qiodevice.cpp b/src/corelib/io/qiodevice.cpp index c80c78bd3b..3b1cd196d2 100644 --- a/src/corelib/io/qiodevice.cpp +++ b/src/corelib/io/qiodevice.cpp @@ -1289,6 +1289,7 @@ qint64 QIODevice::write(const char *data, qint64 maxSize) const char *startOfBlock = data; qint64 writtenSoFar = 0; + const qint64 savedPos = d->pos; forever { const char *endOfBlock = startOfBlock; @@ -1300,7 +1301,7 @@ qint64 QIODevice::write(const char *data, qint64 maxSize) qint64 ret = writeData(startOfBlock, blockSize); if (ret <= 0) { if (writtenSoFar && !sequential) - d->buffer.skip(writtenSoFar); + d->buffer.skip(d->pos - savedPos); return writtenSoFar ? writtenSoFar : ret; } if (!sequential) { @@ -1316,7 +1317,7 @@ qint64 QIODevice::write(const char *data, qint64 maxSize) qint64 ret = writeData("\r\n", 2); if (ret <= 0) { if (writtenSoFar && !sequential) - d->buffer.skip(writtenSoFar); + d->buffer.skip(d->pos - savedPos); return writtenSoFar ? writtenSoFar : ret; } if (!sequential) { @@ -1329,7 +1330,7 @@ qint64 QIODevice::write(const char *data, qint64 maxSize) } if (writtenSoFar && !sequential) - d->buffer.skip(writtenSoFar); + d->buffer.skip(d->pos - savedPos); return writtenSoFar; } #endif |