From 24613a7c3be7dfd4d47a33d9c6da4db635e2bd28 Mon Sep 17 00:00:00 2001 From: Tor Brede Vekterli Date: Mon, 5 Mar 2018 16:53:39 +0000 Subject: 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. --- messagebus/src/vespa/messagebus/network/rpcsendv2.cpp | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) (limited to 'messagebus/src') 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); } -- cgit v1.2.3