diff options
author | Dmitry Shachnev <mitya57@gmail.com> | 2022-05-15 23:58:48 +0300 |
---|---|---|
committer | Qt Cherry-pick Bot <cherrypick_bot@qt-project.org> | 2022-06-27 15:24:38 +0000 |
commit | db246244f5079e87a204d3f2d46d5992ab34e181 (patch) | |
tree | 75293f363eddc4dce79dc3dd34361e97198ea193 /src | |
parent | 77d797d6998768acfd5bfcef686974732670fa5d (diff) |
Make pduFromStream work on big endian (again)
reinterpret_cast<char *>(&code) works on little endian, but not on big
endian, because code is an int (4 bytes value).
I fixed this bug earlier in afb7f76efafcb04e430168416d9d74113bde13bc,
but it was added back in 2c0bb738e988d84f36169e0103d051745b678479.
[ChangeLog][QModbusPdu] Fix reading from stream on big endian systems
Change-Id: Ic432d5c86aac40ec2acdc07b4c4881967a023966
Reviewed-by: Marc Mutz <marc.mutz@qt.io>
(cherry picked from commit e7ce9ac18b5a1ef33e2343d85a01bb7947d1668d)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
Diffstat (limited to 'src')
-rw-r--r-- | src/serialbus/qmodbuspdu.cpp | 21 | ||||
-rw-r--r-- | src/serialbus/qmodbuspdu.h | 1 |
2 files changed, 20 insertions, 2 deletions
diff --git a/src/serialbus/qmodbuspdu.cpp b/src/serialbus/qmodbuspdu.cpp index 112b73d..42548e5 100644 --- a/src/serialbus/qmodbuspdu.cpp +++ b/src/serialbus/qmodbuspdu.cpp @@ -128,11 +128,12 @@ static QDataStream &pduFromStream(QDataStream &stream, Type type, QModbusPdu *pd } raii = { pdu }; QModbusPdu::FunctionCode code = QModbusPdu::FunctionCode::Invalid; - if (stream.readRawData(reinterpret_cast<char *>(&code), sizeof(quint8)) != sizeof(quint8)) + stream >> code; + if (stream.status() == QDataStream::ReadPastEnd) return stream; pdu->setFunctionCode(code); - if (code == QModbusPdu::Invalid || code == QModbusPdu::UndefinedFunctionCode) // shortcut + if (code == QModbusPdu::Invalid) // shortcut return stream; constexpr const int MaxPduDataSize = 252; // in bytes @@ -623,6 +624,22 @@ void QModbusRequest::registerDataSizeCalculator(FunctionCode fc, CalcFuncPtr cal } /*! + \internal + + Reads a FunctionCode from a \a stream. + In stream we serialize FunctionCode as one byte, so we use a temporary char + variable to make the code work on both little endian and big endian systems. + If reading from stream fails, code will retain original value. +*/ +QDataStream &operator>>(QDataStream &stream, QModbusPdu::FunctionCode &code) +{ + char buffer; + if (stream.readRawData(&buffer, 1) == 1) + code = static_cast<QModbusPdu::FunctionCode>(buffer); + return stream; +} + +/*! \relates QModbusRequest Reads a \a pdu from the \a stream and returns a reference to the stream. diff --git a/src/serialbus/qmodbuspdu.h b/src/serialbus/qmodbuspdu.h index f299f24..2c50800 100644 --- a/src/serialbus/qmodbuspdu.h +++ b/src/serialbus/qmodbuspdu.h @@ -187,6 +187,7 @@ private: }; Q_SERIALBUS_EXPORT QDebug operator<<(QDebug debug, const QModbusPdu &pdu); Q_SERIALBUS_EXPORT QDataStream &operator<<(QDataStream &stream, const QModbusPdu &pdu); +Q_SERIALBUS_EXPORT QDataStream &operator>>(QDataStream &stream, QModbusPdu::FunctionCode &code); class QModbusRequest : public QModbusPdu { |