aboutsummaryrefslogtreecommitdiffstats
path: root/messagebus
diff options
context:
space:
mode:
authorTor Brede Vekterli <vekterli@oath.com>2018-03-05 16:53:39 +0000
committerTor Brede Vekterli <vekterli@oath.com>2018-03-05 16:53:39 +0000
commit24613a7c3be7dfd4d47a33d9c6da4db635e2bd28 (patch)
tree0b00cfcb791a980d574e08d650d605bf36ad1fbd /messagebus
parent637f92465afe8866849d61fd1ed768e44b82c731 (diff)
Ensure buffer length returned is independent of evaluation order
`stealBuffer()` nulls out the fields used to compute `getDataLen()`, so if the compiler had decided to evaluate `stealBuffer()` first, we'd end up with a buffer length of zero.
Diffstat (limited to 'messagebus')
-rw-r--r--messagebus/src/vespa/messagebus/network/rpcsendv2.cpp10
1 files changed, 7 insertions, 3 deletions
diff --git a/messagebus/src/vespa/messagebus/network/rpcsendv2.cpp b/messagebus/src/vespa/messagebus/network/rpcsendv2.cpp
index 1228e08f3b4..4c04549aee1 100644
--- a/messagebus/src/vespa/messagebus/network/rpcsendv2.cpp
+++ b/messagebus/src/vespa/messagebus/network/rpcsendv2.cpp
@@ -83,7 +83,7 @@ RPCSendV2::getReturnSpec() const {
namespace {
class OutputBuf : public vespalib::Output {
public:
- OutputBuf(size_t estimatedSize) : _buf(estimatedSize) { }
+ explicit OutputBuf(size_t estimatedSize) : _buf(estimatedSize) { }
DataBuffer & getBuf() { return _buf; }
private:
vespalib::WritableMemory reserve(size_t bytes) override {
@@ -131,7 +131,9 @@ RPCSendV2::encodeRequest(FRT_RPCRequest &req, const Version &version, const Rout
args.AddInt8(type);
args.AddInt32(toCompress.size());
- args.AddData(buf.stealBuffer(), buf.getDataLen());
+ const auto bufferLength = buf.getDataLen();
+ assert(bufferLength <= INT32_MAX);
+ args.AddData(buf.stealBuffer(), bufferLength);
}
namespace {
@@ -256,7 +258,9 @@ RPCSendV2::createResponse(FRT_Values & ret, const string & version, Reply & repl
ret.AddInt8(type);
ret.AddInt32(toCompress.size());
- ret.AddData(buf.stealBuffer(), buf.getDataLen());
+ const auto bufferLength = buf.getDataLen();
+ assert(bufferLength <= INT32_MAX);
+ ret.AddData(buf.stealBuffer(), bufferLength);
}