From 6184790fd29154b59c6219ac7fa1121d8d2bee0f Mon Sep 17 00:00:00 2001 From: Spencer Jackson Date: Thu, 19 Mar 2026 14:57:28 -0700 Subject: [PATCH] SERVER-119317 Improve object lifecycle of MD5 hash state (#50001) GitOrigin-RevId: 0fdd1677b1724f69239befcac04f12b9a605489d --- ...kports_required_for_multiversion_tests.yml | 4 ++++ jstests/core/filemd5.js | 23 ++++++++++++++++++- src/mongo/util/md5.cpp | 2 ++ 3 files changed, 28 insertions(+), 1 deletion(-) diff --git a/etc/backports_required_for_multiversion_tests.yml b/etc/backports_required_for_multiversion_tests.yml index 5025392b17a..d971cddd31d 100644 --- a/etc/backports_required_for_multiversion_tests.yml +++ b/etc/backports_required_for_multiversion_tests.yml @@ -25,6 +25,8 @@ last-continuous: ticket: SERVER-108945 - test_file: jstests/core/json_schema/json_schema.js ticket: SERVER-98676 + - test_file: jstests/core/filemd5.js + ticket: SERVER-119317 - test_file: jstests/sharding/analyze_shard_key/analyze_shard_key_cmd_validation.js ticket: SERVER-95869 - test_file: jstests/change_streams/change_streams_dynamic_match_expressions.js @@ -664,6 +666,8 @@ last-lts: ticket: SERVER-108945 - test_file: jstests/core/json_schema/json_schema.js ticket: SERVER-98676 + - test_file: jstests/core/filemd5.js + ticket: SERVER-119317 - test_file: jstests/sharding/analyze_shard_key/analyze_shard_key_cmd_validation.js ticket: SERVER-95869 - test_file: jstests/change_streams/change_streams_dynamic_match_expressions.js diff --git a/jstests/core/filemd5.js b/jstests/core/filemd5.js index c1a9f20b06b..b97c0c1401a 100644 --- a/jstests/core/filemd5.js +++ b/jstests/core/filemd5.js @@ -24,4 +24,25 @@ assert.commandWorked(db.fs.chunks.insert({files_id: 2, n: 0})); assert.commandFailedWithCode(db.runCommand({filemd5: 2, root: "fs"}), 50848); assert.commandWorked(db.fs.chunks.update({files_id: 2, n: 0}, {$set: {data: 5}})); assert.commandFailedWithCode(db.runCommand({filemd5: 2, root: "fs"}), 50849); -}()); + +{ + const result = assert.commandWorked( + db.runCommand({ + filemd5: ObjectId("000000000000000000000000"), + root: "fs", + partialOk: true, + }), + ); + + assert(result.md5state !== undefined, + "Expected md5state in filemd5 response with partialOk: true"); + const hex = result.md5state.hex(); + const totalBytes = hex.length / 2; + assert.gt(totalBytes, 72, "md5state expected to be larger than 72 bytes"); + + const checkFromByte = 72; + const paddingHex = hex.substring(checkFromByte * 2); + const allZeros = "0".repeat(paddingHex.length); + assert.eq(paddingHex, allZeros, "md5state expected to be zero padded"); +} +})(); diff --git a/src/mongo/util/md5.cpp b/src/mongo/util/md5.cpp index e4e5c2f44c4..062290bdbcf 100644 --- a/src/mongo/util/md5.cpp +++ b/src/mongo/util/md5.cpp @@ -309,6 +309,8 @@ static void md5_process(md5_state_t* pms, const md5_byte_t* data /*[64]*/) { } void md5_init(md5_state_t* pms) { + memset(pms, 0, sizeof(md5_state_t)); + pms->count[0] = pms->count[1] = 0; pms->abcd[0] = 0x67452301; pms->abcd[1] = /*0xefcdab89*/ T_MASK ^ 0x10325476;