diff options
author | Gabriel Marks <gabriel.marks@mongodb.com> | 2022-01-21 19:20:44 +0000 |
---|---|---|
committer | Evergreen Agent <no-reply@evergreen.mongodb.com> | 2022-01-25 22:38:18 +0000 |
commit | 0a0a8790f069e172bfdc277c401f265b992e261b (patch) | |
tree | 8cb5c42b5411701a1cb7027e810ffb6825efe0a8 | |
parent | 0efeb8cb201e48dca15459c863decacd0ac847e7 (diff) | |
download | mongo-0a0a8790f069e172bfdc277c401f265b992e261b.tar.gz |
SERVER-62668 Implement synchronization for ImpersonatedUserMetadata access
(cherry picked from commit 4cab840d3ee82049f70ef67fad0a29e1af24f31a)
-rw-r--r-- | src/mongo/rpc/metadata/impersonated_user_metadata.cpp | 11 |
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) { |