From d7552f1dcefac7e36907fa4db1a7657c3b63db56 Mon Sep 17 00:00:00 2001 From: Aiken Harris Date: Wed, 6 Aug 2025 09:01:47 +0200 Subject: [PATCH] Fix race condition in HlComPortReadLsr The static local variable RingFlag in HlComPortReadLsr caused shared state across multiple calls and ports, leading to race conditions and incorrect behavior. --- xtoskrnl/hl/cport.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/xtoskrnl/hl/cport.c b/xtoskrnl/hl/cport.c index d370a81..2a2071b 100644 --- a/xtoskrnl/hl/cport.c +++ b/xtoskrnl/hl/cport.c @@ -165,7 +165,6 @@ HlComPortReadLsr(IN PCPPORT Port, IN UCHAR Byte) { UCHAR Lsr, Msr; - STATIC UCHAR RingFlag; /* Read the Line Status Register (LSR) */ Lsr = HlIoPortInByte(PtrToUshort(Port->Address + (ULONG)COMPORT_REG_LSR)); @@ -175,8 +174,8 @@ HlComPortReadLsr(IN PCPPORT Port, { /* Check Modem Status Register (MSR) for ring indicator */ Msr = HlIoPortInByte(PtrToUshort(Port->Address + (ULONG)COMPORT_REG_MSR)); - RingFlag |= (Msr & COMPORT_MSR_RI) ? 1 : 2; - if(RingFlag == 3) + Port->Ring |= (Msr & COMPORT_MSR_RI) ? 1 : 2; + if(Port->Ring == 3) { /* Ring indicator toggled, use modem control */ Port->Flags |= COMPORT_FLAG_MC; @@ -283,6 +282,7 @@ HlInitializeComPort(IN OUT PCPPORT Port, Port->Address = PortAddress; Port->Baud = BaudRate; Port->Flags = Flags; + Port->Ring = 0; /* Return success */ return STATUS_SUCCESS;