Skip to content

Commit ffc6e38

Browse files
Adam Cooperevergreen
authored andcommitted
SERVER-44064 Perform explicit cast on MessageCompressorManager parameter
1 parent 21d3803 commit ffc6e38

File tree

2 files changed

+24
-1
lines changed

2 files changed

+24
-1
lines changed

src/mongo/transport/message_compressor_manager.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,10 @@ StatusWith<Message> MessageCompressorManager::decompressMessage(const Message& m
158158
return {ErrorCodes::BadValue, "Decompressed message would be negative in size"};
159159
}
160160

161-
size_t bufferSize = compressionHeader.uncompressedSize + MsgData::MsgDataHeaderSize;
161+
// Explicitly promote `uncompressedSize` to a 64-bit integer before addition in order to
162+
// avoid potential overflow.
163+
size_t bufferSize =
164+
static_cast<size_t>(compressionHeader.uncompressedSize) + MsgData::MsgDataHeaderSize;
162165
if (bufferSize > MaxMessageSizeBytes) {
163166
return {ErrorCodes::BadValue,
164167
"Decompressed message would be larger than maximum message size"};

src/mongo/transport/message_compressor_manager_test.cpp

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -343,6 +343,26 @@ TEST(MessageCompressorManager, MessageSizeTooLarge) {
343343
ASSERT_NOT_OK(status);
344344
}
345345

346+
TEST(MessageCompressorManager, MessageSizeMax32Bit) {
347+
auto registry = buildRegistry();
348+
MessageCompressorManager compManager(&registry);
349+
350+
auto badMessageBuffer = SharedBuffer::allocate(128);
351+
MsgData::View badMessage(badMessageBuffer.get());
352+
badMessage.setId(1);
353+
badMessage.setResponseToMsgId(0);
354+
badMessage.setOperation(dbCompressed);
355+
badMessage.setLen(128);
356+
357+
DataRangeCursor cursor(badMessage.data(), badMessage.data() + badMessage.dataLen());
358+
cursor.writeAndAdvance<LittleEndian<int32_t>>(dbQuery);
359+
cursor.writeAndAdvance<LittleEndian<int32_t>>(std::numeric_limits<int32_t>::max());
360+
cursor.writeAndAdvance<LittleEndian<uint8_t>>(registry.getCompressor("noop")->getId());
361+
362+
auto status = compManager.decompressMessage(Message(badMessageBuffer), nullptr).getStatus();
363+
ASSERT_NOT_OK(status);
364+
}
365+
346366
TEST(MessageCompressorManager, MessageSizeTooSmall) {
347367
auto registry = buildRegistry();
348368
MessageCompressorManager compManager(&registry);

0 commit comments

Comments
 (0)