summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGabriel Marks <gabriel.marks@mongodb.com>2022-01-21 19:20:44 +0000
committerEvergreen Agent <no-reply@evergreen.mongodb.com>2022-01-25 21:05:30 +0000
commitbc3304a44c10e7468678c638e0406a5e479829ab (patch)
treef2987041409a9cff5d0fa860cd4b2dfe629abb69
parenta969f9e1bf030ba9396fff47609321f4ef241d8a (diff)
downloadmongo-bc3304a44c10e7468678c638e0406a5e479829ab.tar.gz
SERVER-62668 Implement synchronization for ImpersonatedUserMetadata access
(cherry picked from commit 4cab840d3ee82049f70ef67fad0a29e1af24f31a)
-rw-r--r--src/mongo/rpc/metadata/impersonated_user_metadata.cpp11
1 files changed, 6 insertions, 5 deletions
diff --git a/src/mongo/rpc/metadata/impersonated_user_metadata.cpp b/src/mongo/rpc/metadata/impersonated_user_metadata.cpp
index bf068490f41..64b78931f39 100644
--- a/src/mongo/rpc/metadata/impersonated_user_metadata.cpp
+++ b/src/mongo/rpc/metadata/impersonated_user_metadata.cpp
@@ -38,12 +38,12 @@ namespace mongo {
namespace rpc {
namespace {
-static const OperationContext::Decoration<MaybeImpersonatedUserMetadata> getForOpCtx =
- OperationContext::declareDecoration<MaybeImpersonatedUserMetadata>();
+static const auto getForOpCtx =
+ OperationContext::declareDecoration<synchronized_value<MaybeImpersonatedUserMetadata>>();
} // namespace
MaybeImpersonatedUserMetadata getImpersonatedUserMetadata(OperationContext* opCtx) {
- return opCtx ? getForOpCtx(opCtx) : boost::none;
+ return opCtx ? getForOpCtx(opCtx).get() : boost::none;
}
void readImpersonatedUserMetadata(const BSONElement& elem, OperationContext* opCtx) {
@@ -53,7 +53,7 @@ void readImpersonatedUserMetadata(const BSONElement& elem, OperationContext* opC
}
// Always reset the current impersonation data to boost::none.
- getForOpCtx(opCtx) = boost::none;
+ MaybeImpersonatedUserMetadata newData;
if (elem.type() == Object) {
IDLParserErrorContext errCtx(kImpersonationMetadataSectionName);
auto data = ImpersonatedUserMetadata::parse(errCtx, elem.embeddedObject());
@@ -61,9 +61,10 @@ void readImpersonatedUserMetadata(const BSONElement& elem, OperationContext* opC
// Set the impersonation data only if there are actually impersonated
// users/roles.
if ((!data.getUsers().empty()) || (!data.getRoles().empty())) {
- getForOpCtx(opCtx) = std::move(data);
+ newData = std::move(data);
}
}
+ *getForOpCtx(opCtx) = std::move(newData);
}
void writeAuthDataToImpersonatedUserMetadata(OperationContext* opCtx, BSONObjBuilder* out) {