From d8efbdeb90294fd974232d81129a251ad4ece8af Mon Sep 17 00:00:00 2001 From: SylvainM98 <70053483+SylvainM98@users.noreply.github.com> Date: Wed, 19 Aug 2026 15:47:11 +0200 Subject: [PATCH 1/3] Bound init transactions during distro operations --- src/windows/service/exe/WslCoreInstance.cpp | 6 +-- test/windows/UnitTests.cpp | 49 +++++++++++++++++++++ 2 files changed, 52 insertions(+), 3 deletions(-) diff --git a/src/windows/service/exe/WslCoreInstance.cpp b/src/windows/service/exe/WslCoreInstance.cpp index 844f536cc9..6957790935 100644 --- a/src/windows/service/exe/WslCoreInstance.cpp +++ b/src/windows/service/exe/WslCoreInstance.cpp @@ -225,7 +225,7 @@ void WslCoreInstance::CreateLxProcess( ULONG port; { auto sessionLock = sessionLeader->Lock(); - port = sessionLeader->GetChannel().Transaction(messageSpan).Result; + port = sessionLeader->GetChannel().Transaction(messageSpan, nullptr, m_socketTimeout).Result; } // Connect to the port specified by the session leader. @@ -354,7 +354,7 @@ void WslCoreInstance::UpdateTimezone() wsl::windows::common::helpers::GenerateTimezoneUpdateMessage(wsl::windows::common::helpers::GetLinuxTimezone(m_userToken.get())); auto lock = m_initChannel->Lock(); - auto transaction = m_initChannel->GetChannel().StartTransaction(); + auto transaction = m_initChannel->GetChannel().StartTransaction(m_socketTimeout); transaction.Send(gsl::make_span(message)); } @@ -401,7 +401,7 @@ void WslCoreInstance::Initialize() auto config = wsl::windows::common::helpers::GenerateConfigurationMessage( m_configuration.Name, fixedDrives, m_defaultUid, timezone, {}, m_featureFlags, drvfsMount); - auto transaction = m_initChannel->GetChannel().StartTransaction(); + auto transaction = m_initChannel->GetChannel().StartTransaction(m_socketTimeout); transaction.Send(gsl::span(config)); // Init replies with information about the distribution. diff --git a/test/windows/UnitTests.cpp b/test/windows/UnitTests.cpp index 035323b75a..db8b91f9e9 100644 --- a/test/windows/UnitTests.cpp +++ b/test/windows/UnitTests.cpp @@ -7711,6 +7711,55 @@ Error code: Wsl/InstallDistro/WSL_E_INVALID_JSON\r\n", const auto hr = wil::ResultFromException([&]() { channel.ReceiveMessage>(nullptr, 100); }); VERIFY_ARE_EQUAL(hr, HRESULT_FROM_WIN32(ERROR_TIMEOUT)); } + + { + auto [client, server] = MakeSocketPair(); + wsl::shared::SocketChannel channel{std::move(client), "client"}; + auto transaction = channel.StartTransaction(200); + + RESULT_MESSAGE request{}; + request.Header.MessageType = RESULT_MESSAGE::Type; + request.Header.MessageSize = sizeof(request); + transaction.Send(request); + + RESULT_MESSAGE receivedRequest{}; + recvAll(server.get(), &receivedRequest, sizeof(receivedRequest)); + VERIFY_ARE_EQUAL(receivedRequest.Header.TransactionStep, static_cast(TRANSACTION_STEP::REQUEST)); + + const auto start = std::chrono::steady_clock::now(); + const auto hr = wil::ResultFromException([&]() { transaction.Receive>(); }); + const auto elapsed = + std::chrono::duration_cast(std::chrono::steady_clock::now() - start).count(); + + VERIFY_ARE_EQUAL(hr, HRESULT_FROM_WIN32(ERROR_TIMEOUT)); + VERIFY_IS_GREATER_THAN_OR_EQUAL(elapsed, 100LL); + VERIFY_IS_LESS_THAN(elapsed, 5000LL); + } + + { + auto [client, server] = MakeSocketPair(); + wsl::shared::SocketChannel channel{std::move(client), "client"}; + auto transaction = channel.StartTransaction(1000); + + RESULT_MESSAGE request{}; + request.Header.MessageType = RESULT_MESSAGE::Type; + request.Header.MessageSize = sizeof(request); + transaction.Send(request); + + RESULT_MESSAGE receivedRequest{}; + recvAll(server.get(), &receivedRequest, sizeof(receivedRequest)); + + RESULT_MESSAGE response{}; + response.Header.MessageType = RESULT_MESSAGE::Type; + response.Header.MessageSize = sizeof(response); + response.Header.TransactionId = receivedRequest.Header.TransactionId; + response.Header.TransactionStep = static_cast(TRANSACTION_STEP::FIRST_REPLY); + response.Result = 42; + WriteSocket(server.get(), &response, sizeof(response)); + + const auto& receivedResponse = transaction.Receive>(); + VERIFY_ARE_EQUAL(receivedResponse.Result, 42); + } } TEST_METHOD(DownloadToHiddenSystemTempFolder) From 2ac2fe0ba89e9630700e36e80cdfe789b816d120 Mon Sep 17 00:00:00 2001 From: SylvainM98 <70053483+SylvainM98@users.noreply.github.com> Date: Wed, 19 Aug 2026 15:50:06 +0200 Subject: [PATCH 2/3] Strengthen socket transaction timeout tests --- test/windows/UnitTests.cpp | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/test/windows/UnitTests.cpp b/test/windows/UnitTests.cpp index db8b91f9e9..bcb1d476cb 100644 --- a/test/windows/UnitTests.cpp +++ b/test/windows/UnitTests.cpp @@ -7713,9 +7713,12 @@ Error code: Wsl/InstallDistro/WSL_E_INVALID_JSON\r\n", } { + constexpr DWORD transactionTimeout = 200; + constexpr LONGLONG schedulingTolerance = 50; + constexpr LONGLONG maximumWait = 5000; auto [client, server] = MakeSocketPair(); wsl::shared::SocketChannel channel{std::move(client), "client"}; - auto transaction = channel.StartTransaction(200); + auto transaction = channel.StartTransaction(transactionTimeout); RESULT_MESSAGE request{}; request.Header.MessageType = RESULT_MESSAGE::Type; @@ -7732,14 +7735,16 @@ Error code: Wsl/InstallDistro/WSL_E_INVALID_JSON\r\n", std::chrono::duration_cast(std::chrono::steady_clock::now() - start).count(); VERIFY_ARE_EQUAL(hr, HRESULT_FROM_WIN32(ERROR_TIMEOUT)); - VERIFY_IS_GREATER_THAN_OR_EQUAL(elapsed, 100LL); - VERIFY_IS_LESS_THAN(elapsed, 5000LL); + VERIFY_IS_GREATER_THAN_OR_EQUAL(elapsed, static_cast(transactionTimeout) - schedulingTolerance); + VERIFY_IS_LESS_THAN(elapsed, maximumWait); } { + constexpr DWORD transactionTimeout = 1000; + constexpr int32_t expectedResult = 42; auto [client, server] = MakeSocketPair(); wsl::shared::SocketChannel channel{std::move(client), "client"}; - auto transaction = channel.StartTransaction(1000); + auto transaction = channel.StartTransaction(transactionTimeout); RESULT_MESSAGE request{}; request.Header.MessageType = RESULT_MESSAGE::Type; @@ -7754,11 +7759,11 @@ Error code: Wsl/InstallDistro/WSL_E_INVALID_JSON\r\n", response.Header.MessageSize = sizeof(response); response.Header.TransactionId = receivedRequest.Header.TransactionId; response.Header.TransactionStep = static_cast(TRANSACTION_STEP::FIRST_REPLY); - response.Result = 42; + response.Result = expectedResult; WriteSocket(server.get(), &response, sizeof(response)); const auto& receivedResponse = transaction.Receive>(); - VERIFY_ARE_EQUAL(receivedResponse.Result, 42); + VERIFY_ARE_EQUAL(receivedResponse.Result, expectedResult); } } From a781affff9108b076107de77428921126a83a574 Mon Sep 17 00:00:00 2001 From: SylvainM98 <70053483+SylvainM98@users.noreply.github.com> Date: Thu, 20 Aug 2026 08:38:06 +0200 Subject: [PATCH 3/3] Remove unrelated transaction timeout tests --- test/windows/UnitTests.cpp | 54 -------------------------------------- 1 file changed, 54 deletions(-) diff --git a/test/windows/UnitTests.cpp b/test/windows/UnitTests.cpp index bcb1d476cb..035323b75a 100644 --- a/test/windows/UnitTests.cpp +++ b/test/windows/UnitTests.cpp @@ -7711,60 +7711,6 @@ Error code: Wsl/InstallDistro/WSL_E_INVALID_JSON\r\n", const auto hr = wil::ResultFromException([&]() { channel.ReceiveMessage>(nullptr, 100); }); VERIFY_ARE_EQUAL(hr, HRESULT_FROM_WIN32(ERROR_TIMEOUT)); } - - { - constexpr DWORD transactionTimeout = 200; - constexpr LONGLONG schedulingTolerance = 50; - constexpr LONGLONG maximumWait = 5000; - auto [client, server] = MakeSocketPair(); - wsl::shared::SocketChannel channel{std::move(client), "client"}; - auto transaction = channel.StartTransaction(transactionTimeout); - - RESULT_MESSAGE request{}; - request.Header.MessageType = RESULT_MESSAGE::Type; - request.Header.MessageSize = sizeof(request); - transaction.Send(request); - - RESULT_MESSAGE receivedRequest{}; - recvAll(server.get(), &receivedRequest, sizeof(receivedRequest)); - VERIFY_ARE_EQUAL(receivedRequest.Header.TransactionStep, static_cast(TRANSACTION_STEP::REQUEST)); - - const auto start = std::chrono::steady_clock::now(); - const auto hr = wil::ResultFromException([&]() { transaction.Receive>(); }); - const auto elapsed = - std::chrono::duration_cast(std::chrono::steady_clock::now() - start).count(); - - VERIFY_ARE_EQUAL(hr, HRESULT_FROM_WIN32(ERROR_TIMEOUT)); - VERIFY_IS_GREATER_THAN_OR_EQUAL(elapsed, static_cast(transactionTimeout) - schedulingTolerance); - VERIFY_IS_LESS_THAN(elapsed, maximumWait); - } - - { - constexpr DWORD transactionTimeout = 1000; - constexpr int32_t expectedResult = 42; - auto [client, server] = MakeSocketPair(); - wsl::shared::SocketChannel channel{std::move(client), "client"}; - auto transaction = channel.StartTransaction(transactionTimeout); - - RESULT_MESSAGE request{}; - request.Header.MessageType = RESULT_MESSAGE::Type; - request.Header.MessageSize = sizeof(request); - transaction.Send(request); - - RESULT_MESSAGE receivedRequest{}; - recvAll(server.get(), &receivedRequest, sizeof(receivedRequest)); - - RESULT_MESSAGE response{}; - response.Header.MessageType = RESULT_MESSAGE::Type; - response.Header.MessageSize = sizeof(response); - response.Header.TransactionId = receivedRequest.Header.TransactionId; - response.Header.TransactionStep = static_cast(TRANSACTION_STEP::FIRST_REPLY); - response.Result = expectedResult; - WriteSocket(server.get(), &response, sizeof(response)); - - const auto& receivedResponse = transaction.Receive>(); - VERIFY_ARE_EQUAL(receivedResponse.Result, expectedResult); - } } TEST_METHOD(DownloadToHiddenSystemTempFolder)