CRC Stream crash fix in case of unsuccessful read/write
Signed-off-by: Arpad Boda <aboda@apache.org>
Approved by bakaid and szaszm on GH
diff --git a/libminifi/include/io/CRCStream.h b/libminifi/include/io/CRCStream.h
index 95e3a11..2c7f3d5 100644
--- a/libminifi/include/io/CRCStream.h
+++ b/libminifi/include/io/CRCStream.h
@@ -189,7 +189,9 @@
template<typename T>
int CRCStream<T>::readData(uint8_t *buf, int buflen) {
int ret = child_stream_->read(buf, buflen);
- crc_ = crc32(crc_, buf, ret);
+ if (ret > 0) {
+ crc_ = crc32(crc_, buf, ret);
+ }
return ret;
}
@@ -205,7 +207,9 @@
int CRCStream<T>::writeData(uint8_t *value, int size) {
int ret = child_stream_->write(value, size);
- crc_ = crc32(crc_, value, size);
+ if (ret > 0) {
+ crc_ = crc32(crc_, value, ret);
+ }
return ret;
}
diff --git a/nanofi/include/sitetosite/CSiteToSite.h b/nanofi/include/sitetosite/CSiteToSite.h
index 0569f04..a35b3c5 100644
--- a/nanofi/include/sitetosite/CSiteToSite.h
+++ b/nanofi/include/sitetosite/CSiteToSite.h
@@ -324,14 +324,18 @@
static int writeData(CTransaction * transaction, const uint8_t *value, int size) {
int ret = write_buffer(value, size, transaction->_stream);
- transaction->_crc = crc32(transaction->_crc, value, size);
+ if (ret > 0) {
+ transaction->_crc = crc32(transaction->_crc, value, ret);
+ }
return ret;
}
static int readData(CTransaction * transaction, uint8_t *buf, int buflen) {
//int ret = transaction->_stream->read(buf, buflen);
int ret = read_buffer(buf, buflen, transaction->_stream);
- transaction->_crc = crc32(transaction->_crc, buf, ret);
+ if (ret > 0) {
+ transaction->_crc = crc32(transaction->_crc, buf, ret);
+ }
return ret;
}