Skip to content

Commit 7817b87

Browse files
addaleaxtargos
authored andcommitted
worker: fix race condition in node_messaging.cc
`AddToIncomingQueue()` relies on `owner_` only being modified with `mutex_` being locked, but in these two places, that didn’t happen. Modify them to use `Detach()` instead, which has the same effect as setting `owner_ = nullptr` here, but does it with proper locking. This race condition probably only shows up in practice when Node.js is compiled in debug mode, because the compiler eliminates the duplicate load in `AddToIncomingQueue()` when compiling with optimizations enabled. PR-URL: #33429 Reviewed-By: Colin Ihrig <[email protected]> Reviewed-By: David Carlier <[email protected]> Reviewed-By: James M Snell <[email protected]>
1 parent f6227c0 commit 7817b87

File tree

1 file changed

+3
-5
lines changed

1 file changed

+3
-5
lines changed

src/node_messaging.cc

+3-5
Original file line numberDiff line numberDiff line change
@@ -464,8 +464,7 @@ void MessagePortData::Disentangle() {
464464
}
465465

466466
MessagePort::~MessagePort() {
467-
if (data_)
468-
data_->owner_ = nullptr;
467+
if (data_) Detach();
469468
}
470469

471470
MessagePort::MessagePort(Environment* env,
@@ -662,10 +661,9 @@ void MessagePort::OnMessage() {
662661
void MessagePort::OnClose() {
663662
Debug(this, "MessagePort::OnClose()");
664663
if (data_) {
665-
data_->owner_ = nullptr;
666-
data_->Disentangle();
664+
// Detach() returns move(data_).
665+
Detach()->Disentangle();
667666
}
668-
data_.reset();
669667
}
670668

671669
std::unique_ptr<MessagePortData> MessagePort::Detach() {

0 commit comments

Comments
 (0)