diff options
author | Tor Brede Vekterli <vekterli@oath.com> | 2018-03-05 16:53:39 +0000 |
---|---|---|
committer | Tor Brede Vekterli <vekterli@oath.com> | 2018-03-05 16:53:39 +0000 |
commit | 24613a7c3be7dfd4d47a33d9c6da4db635e2bd28 (patch) | |
tree | 0b00cfcb791a980d574e08d650d605bf36ad1fbd /messagebus | |
parent | 637f92465afe8866849d61fd1ed768e44b82c731 (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.cpp | 10 |
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); } |