summaryrefslogtreecommitdiff
path: root/src/mongo/db/exec/bucket_unpacker.cpp
diff options
context:
space:
mode:
authorHenrik Edin <henrik.edin@mongodb.com>2021-10-28 13:02:44 +0000
committerEvergreen Agent <no-reply@evergreen.mongodb.com>2021-10-28 13:29:33 +0000
commit6e98a462d6e3f2222bc53bc948b60721e7879999 (patch)
tree503f8fa634ca07e7cde8dfb7b4a7914f94f17dd9 /src/mongo/db/exec/bucket_unpacker.cpp
parenta8408f0d115740981f9ed9ec10ca20aa58776902 (diff)
downloadmongo-6e98a462d6e3f2222bc53bc948b60721e7879999.tar.gz
SERVER-60676 Improve robustness when parsing invalid BSONColumn binary or compressed v2 buckets
* Changed BSONColumn::operator[] interface so we can differentiate skipped element from out of bounds * Replaced BadValue error codes in BSONColumn for unique assertion ids * Throw exception when interleaved mode exits unexpectedly when it shouldn't * Test and handle buckets where the compressed columns contain different amount of fields
Diffstat (limited to 'src/mongo/db/exec/bucket_unpacker.cpp')
-rw-r--r--src/mongo/db/exec/bucket_unpacker.cpp14
1 files changed, 10 insertions, 4 deletions
diff --git a/src/mongo/db/exec/bucket_unpacker.cpp b/src/mongo/db/exec/bucket_unpacker.cpp
index ba7d5554630..87aa9f18c20 100644
--- a/src/mongo/db/exec/bucket_unpacker.cpp
+++ b/src/mongo/db/exec/bucket_unpacker.cpp
@@ -277,6 +277,9 @@ bool BucketUnpackerV2::getNext(MutableDocument& measurement,
}
for (auto& fieldColumn : _fieldColumns) {
+ uassert(6067601,
+ "Bucket unexpectedly contained fewer values than count",
+ fieldColumn.it != fieldColumn.column.end());
const BSONElement& elem = *(fieldColumn.it++);
// EOO represents missing field
if (!elem.eoo()) {
@@ -296,9 +299,10 @@ void BucketUnpackerV2::extractSingleMeasurement(MutableDocument& measurement,
bool includeTimeField,
bool includeMetaField) {
if (includeTimeField) {
- BSONElement val = _timeColumn.column[j];
- uassert(6067500, "Bucket unexpectedly contained fewer values than count", !val.eoo());
- measurement.addField(_timeColumn.column.name(), Value{val});
+ auto val = _timeColumn.column[j];
+ uassert(
+ 6067500, "Bucket unexpectedly contained fewer values than count", val && !val->eoo());
+ measurement.addField(_timeColumn.column.name(), Value{*val});
}
if (includeMetaField && !metaValue.isNull()) {
@@ -307,7 +311,9 @@ void BucketUnpackerV2::extractSingleMeasurement(MutableDocument& measurement,
if (includeTimeField) {
for (auto& fieldColumn : _fieldColumns) {
- measurement.addField(fieldColumn.column.name(), Value{fieldColumn.column[j]});
+ auto val = fieldColumn.column[j];
+ uassert(6067600, "Bucket unexpectedly contained fewer values than count", val);
+ measurement.addField(fieldColumn.column.name(), Value{*val});
}
}
}