Make sure that message structures are correctly zero-initialized (#41373)

* Make sure that message structures are correctly zero-initialized Several message structures were declared without value-initialization before their fields were assigned. Use {} consistently at the declaration so the structures start out zeroed. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Drop redundant initializers from WSLC message declarations The WSLC_* message types declare a default constructor via DECLARE_MESSAGE_CTOR, so adding {} at the declaration has no effect for them. Limit the change to the aggregate message types, where {} actually initializes the structure. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --------- Co-authored-by: Ben Hillis <benhill@ntdev.microsoft.com> Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

Ben Hillis committed Aug 18, 2026 at 15:47 UTC 5106ffee8ee6015b57b9eb8f2cbdfbcbd50e2caa
7 files changed +14 -14
src/linux/init/binfmt.cpp
+2 -2
@@ -544,7 +544,7 @@ Return Value:
544 MESSAGE_HEADER Header;
545 LX_INIT_PROCESS_EXIT_STATUS ExitStatus;
546 LX_INIT_CREATE_PROCESS_RESPONSE Response;
547 - } Reply;
547 + } Reply{};
548
549 Bytes = TEMP_FAILURE_RETRY(read(PollDescriptors[0].fd, &Reply, sizeof(Reply)));
550 if (Bytes < 0)
@@ -1054,7 +1054,7 @@ Return Value:
1054 return;
1055 }
1056
1057 - LX_INIT_WINDOW_SIZE_CHANGED ResizeMessage;
1057 + LX_INIT_WINDOW_SIZE_CHANGED ResizeMessage{};
1058 ResizeMessage.Header.MessageType = LxInitMessageWindowSizeChanged;
1059 ResizeMessage.Header.MessageSize = sizeof(ResizeMessage);
1060 ResizeMessage.Columns = WindowSize.ws_col;
src/linux/init/drvfs.cpp
+1 -1
@@ -346,7 +346,7 @@ Return Value:
346 // Query the interop server for which port to use.
347 //
348
349 - MESSAGE_HEADER QueryPortMessage;
349 + MESSAGE_HEADER QueryPortMessage{};
350 QueryPortMessage.MessageType = LxInitMessageQueryDrvfsElevated;
351 QueryPortMessage.MessageSize = sizeof(QueryPortMessage);
352
src/linux/init/init.cpp
+2 -2
@@ -1238,7 +1238,7 @@ try
1238 SocketAddress.svm_port = -1;
1239 }
1240
1241 - LX_INIT_CREATE_SESSION_RESPONSE Response;
1241 + LX_INIT_CREATE_SESSION_RESPONSE Response{};
1242 Response.Header.MessageType = LxInitMessageCreateSessionResponse;
1243 Response.Header.MessageSize = sizeof(Response);
1244 Response.Port = SocketAddress.svm_port;
@@ -1378,7 +1378,7 @@ Return Value:
1378 pid_t ChildPid;
1379 wsl::shared::SocketChannel ControlChannel;
1380
1381 - LX_INIT_PROCESS_EXIT_STATUS ExitStatus;
1381 + LX_INIT_PROCESS_EXIT_STATUS ExitStatus{};
1382 unsigned int Index;
1383 bool InteropEnabled;
1384 InteropServer InteropServer;
src/linux/init/main.cpp
+1 -1
@@ -2821,7 +2821,7 @@ Return Value:
2821 --*/
2822 try
2823 {
2824 - LX_MINI_INIT_MOUNT_RESULT_MESSAGE Message;
2824 + LX_MINI_INIT_MOUNT_RESULT_MESSAGE Message{};
2825 Message.Header.MessageSize = sizeof(Message);
2826 Message.Header.MessageType = LxMiniInitMessageMountStatus;
2827 Message.Result = Result;
src/linux/init/util.cpp
+2 -2
@@ -1218,7 +1218,7 @@ Return Value:
1218 return FeatureFlags;
1219 }
1220
1221 - MESSAGE_HEADER Message;
1221 + MESSAGE_HEADER Message{};
1222 Message.MessageType = LxInitMessageQueryFeatureFlags;
1223 Message.MessageSize = sizeof(Message);
1224
@@ -1288,7 +1288,7 @@ try
1288 wsl::shared::SocketChannel channel{UtilConnectUnix(WSL_INIT_INTEROP_SOCKET), "wslinfo"};
1289 THROW_LAST_ERROR_IF(channel.Socket() < 0);
1290
1291 - MESSAGE_HEADER Message;
1291 + MESSAGE_HEADER Message{};
1292 Message.MessageType = LxInitMessageQueryNetworkingMode;
1293 Message.MessageSize = sizeof(Message);
1294
src/windows/common/interop.cpp
+2 -2
@@ -330,7 +330,7 @@ void CreateProcessVmMode(_In_ const GUID& VmId, _In_ const gsl::span<gsl::byte>&
330 if (Result.Status == 0)
331 {
332 // Process messages from the binfmt interpreter and wait for the process to exit.
333 - LX_INIT_PROCESS_EXIT_STATUS ExitStatus;
333 + LX_INIT_PROCESS_EXIT_STATUS ExitStatus{};
334 ExitStatus.Header.MessageType = LxInitMessageExitStatus;
335 ExitStatus.Header.MessageSize = sizeof(ExitStatus);
336 ExitStatus.ExitCode = ProcessInteropMessages(reinterpret_cast<HANDLE>(Sockets[3].get()), &Result);
@@ -551,7 +551,7 @@ void wsl::windows::common::interop::WorkerThread(_In_ wil::unique_handle&& Serve
551
552 // Process messages from the binfmt interpreter and wait for the
553 // process to exit.
554 - LX_INIT_PROCESS_EXIT_STATUS ExitStatus;
554 + LX_INIT_PROCESS_EXIT_STATUS ExitStatus{};
555 ExitStatus.Header.MessageType = LxInitMessageExitStatus;
556 ExitStatus.Header.MessageSize = sizeof(ExitStatus);
557 ExitStatus.ExitCode = ProcessInteropMessages(SignalPipe.first.get(), &Result);
src/windows/service/exe/WslCoreVm.cpp
+4 -4
@@ -2133,7 +2133,7 @@ WslCoreVm::MountFileAsPersistentMemory(_In_ PCWSTR FilePath, _In_ bool ReadOnly)
2133 void WslCoreVm::WaitForPmemDeviceInVm(_In_ ULONG PmemId)
2134 {
2135 // Construct the mini_init message.
2136 - LX_MINI_INIT_WAIT_FOR_PMEM_DEVICE_MESSAGE message;
2136 + LX_MINI_INIT_WAIT_FOR_PMEM_DEVICE_MESSAGE message{};
2137 message.Header.MessageType = LxMiniInitMessageWaitForPmemDevice;
2138 message.Header.MessageSize = sizeof(message);
2139 message.PmemId = PmemId;
@@ -2469,7 +2469,7 @@ void WslCoreVm::ResizeDistribution(_In_ ULONG Lun, _In_ HANDLE OutputHandle, _In
2469 {
2470 auto lock = m_lock.lock_exclusive();
2471
2472 - LX_MINI_INIT_RESIZE_DISTRIBUTION_MESSAGE message;
2472 + LX_MINI_INIT_RESIZE_DISTRIBUTION_MESSAGE message{};
2473 message.Header.MessageSize = sizeof(message);
2474 message.Header.MessageType = LxMiniInitMessageResizeDistribution;
2475 message.ScsiLun = Lun;
@@ -2494,7 +2494,7 @@ void WslCoreVm::TrimDistribution(_In_ ULONG Lun)
2494 {
2495 auto lock = m_lock.lock_exclusive();
2496
2497 - LX_MINI_INIT_TRIM_DISTRIBUTION_MESSAGE message;
2497 + LX_MINI_INIT_TRIM_DISTRIBUTION_MESSAGE message{};
2498 message.Header.MessageSize = sizeof(message);
2499 message.Header.MessageType = LxMiniInitMessageTrimDistribution;
2500 message.ScsiLun = Lun;
@@ -2566,7 +2566,7 @@ std::pair<int, LX_MINI_MOUNT_STEP> WslCoreVm::UnmountDisk(_In_ const AttachedDis
2566 }
2567
2568 // Tell the guest to flush its IO caches and stop using the disk.
2569 - LX_MINI_INIT_DETACH_MESSAGE message;
2569 + LX_MINI_INIT_DETACH_MESSAGE message{};
2570 message.Header.MessageType = LxMiniInitMessageDetach;
2571 message.Header.MessageSize = sizeof(message);
2572 message.ScsiLun = State.Lun;