QDataStream: use qint64 to represent size while reading and writing

Do that to avoid narrowing at the call site on 32-bit platforms.

Amends fd48ce0b73c74dafd5db27bc1f2752ef665df7ef

Found in 6.7 API review

Change-Id: I31142399385521d973b2ed3789745569e44d5d63
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
(cherry picked from commit 0ed34d19926c60f3b74a58723c5c36f366e99d95)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
This commit is contained in:
Ivan Solovev 2024-01-26 12:50:46 +01:00 committed by Qt Cherry-pick Bot
parent 7d0578b11f
commit cc1476c608
4 changed files with 23 additions and 34 deletions

View File

@ -708,9 +708,9 @@ bool QDateTime::precedes(const QDateTime &other) const
QDataStream &QDataStream::readBytes(char *&s, uint &l)
{
qsizetype length = 0;
qint64 length = 0;
(void)readBytes(s, length);
if (length != qsizetype(uint(length))) {
if (length != qint64(uint(length))) {
setStatus(ReadCorruptData); // Cannot store length in l
delete[] s;
l = 0;
@ -722,12 +722,7 @@ QDataStream &QDataStream::readBytes(char *&s, uint &l)
QDataStream &QDataStream::writeBytes(const char *s, uint len)
{
qsizetype length = qsizetype(len);
if (length < 0) {
setStatus(WriteFailed);
return *this;
}
return writeBytes(s, length);
return writeBytes(s, qint64(len));
}
int QDataStream::skipRawData(int len)
@ -735,25 +730,21 @@ int QDataStream::skipRawData(int len)
return int(skipRawData(qint64(len)));
}
#if QT_POINTER_SIZE != 4
int QDataStream::readBlock(char *data, int len)
{
return int(readBlock(data, qsizetype(len)));
return int(readBlock(data, qint64(len)));
}
int QDataStream::readRawData(char *s, int len)
{
return int(readRawData(s, qsizetype(len)));
return int(readRawData(s, qint64(len)));
}
int QDataStream::writeRawData(const char *s, int len)
{
return writeRawData(s, qsizetype(len));
return writeRawData(s, qint64(len));
}
#endif // QT_POINTER_SIZE != 4
#if defined(Q_OS_ANDROID)
#include "qjniobject.h"

View File

@ -757,13 +757,13 @@ bool QDataStream::isDeviceTransactionStarted() const
\internal
*/
qsizetype QDataStream::readBlock(char *data, qsizetype len)
qint64 QDataStream::readBlock(char *data, qint64 len)
{
// Disable reads on failure in transacted stream
if (q_status != Ok && dev->isTransactionStarted())
return -1;
const qsizetype readResult = dev->read(data, len);
const qint64 readResult = dev->read(data, len);
if (readResult != len)
setStatus(ReadPastEnd);
return readResult;
@ -1002,7 +1002,7 @@ QDataStream &QDataStream::operator>>(double &f)
QDataStream &QDataStream::operator>>(char *&s)
{
qsizetype len = 0;
qint64 len = 0;
return readBytes(s, len);
}
@ -1057,7 +1057,7 @@ QDataStream &QDataStream::operator>>(char32_t &c)
\sa readRawData(), writeBytes()
*/
QDataStream &QDataStream::readBytes(char *&s, qsizetype &l)
QDataStream &QDataStream::readBytes(char *&s, qint64 &l)
{
s = nullptr;
l = 0;
@ -1069,7 +1069,7 @@ QDataStream &QDataStream::readBytes(char *&s, qsizetype &l)
qsizetype len = qsizetype(length);
if (length != len || length < 0) {
setStatus(SizeLimitExceeded); // Cannot store len in l
setStatus(SizeLimitExceeded); // Cannot store len
return *this;
}
@ -1108,7 +1108,7 @@ QDataStream &QDataStream::readBytes(char *&s, qsizetype &l)
\sa readBytes(), QIODevice::read(), writeRawData()
*/
qsizetype QDataStream::readRawData(char *s, qsizetype len)
qint64 QDataStream::readRawData(char *s, qint64 len)
{
CHECK_STREAM_PRECOND(-1)
return readBlock(s, len);
@ -1389,7 +1389,7 @@ QDataStream &QDataStream::operator<<(char32_t c)
\sa writeRawData(), readBytes()
*/
QDataStream &QDataStream::writeBytes(const char *s, qsizetype len)
QDataStream &QDataStream::writeBytes(const char *s, qint64 len)
{
if (len < 0) {
q_status = WriteFailed;
@ -1410,10 +1410,10 @@ QDataStream &QDataStream::writeBytes(const char *s, qsizetype len)
\sa writeBytes(), QIODevice::write(), readRawData()
*/
qsizetype QDataStream::writeRawData(const char *s, qsizetype len)
qint64 QDataStream::writeRawData(const char *s, qint64 len)
{
CHECK_STREAM_WRITE_PRECOND(-1)
qsizetype ret = dev->write(s, len);
qint64 ret = dev->write(s, len);
if (ret != len)
q_status = WriteFailed;
return ret;

View File

@ -180,15 +180,13 @@ public:
QDataStream &readBytes(char *&, uint &len);
QDataStream &writeBytes(const char *, uint len);
int skipRawData(int len);
#endif
#if QT_CORE_REMOVED_SINCE(6, 7) && QT_POINTER_SIZE != 4
int readRawData(char *, int len);
int writeRawData(const char *, int len);
#endif
QDataStream &readBytes(char *&, qsizetype &len);
qsizetype readRawData(char *, qsizetype len);
QDataStream &writeBytes(const char *, qsizetype len);
qsizetype writeRawData(const char *, qsizetype len);
QDataStream &readBytes(char *&, qint64 &len);
qint64 readRawData(char *, qint64 len);
QDataStream &writeBytes(const char *, qint64 len);
qint64 writeRawData(const char *, qint64 len);
qint64 skipRawData(qint64 len);
void startTransaction();
@ -208,10 +206,10 @@ private:
ByteOrder byteorder;
int ver;
Status q_status;
#if QT_CORE_REMOVED_SINCE(6, 7) && QT_POINTER_SIZE != 4
#if QT_CORE_REMOVED_SINCE(6, 7)
int readBlock(char *data, int len);
#endif
qsizetype readBlock(char *data, qsizetype len);
qint64 readBlock(char *data, qint64 len);
static inline qint64 readQSizeType(QDataStream &s);
static inline void writeQSizeType(QDataStream &s, qint64 value);
enum class QDataStreamSizes : quint32 { NullCode = 0xffffffffu, ExtendedSize = 0xfffffffeu };

View File

@ -2818,10 +2818,10 @@ void tst_QDataStream::status_charptr_QByteArray()
{
QDataStream stream(&data, QIODevice::ReadOnly);
char *buf;
qsizetype len;
qint64 len;
stream.readBytes(buf, len);
QCOMPARE(len, expectedString.size());
QCOMPARE(len, qint64(expectedString.size()));
QCOMPARE(QByteArray(buf, len), expectedString);
QCOMPARE(int(stream.status()), expectedStatus);
delete [] buf;