Fix race condition in HlComPortReadLsr
All checks were successful
Builds / ExectOS (amd64, debug) (push) Successful in 44s
Builds / ExectOS (amd64, release) (push) Successful in 45s
Builds / ExectOS (i686, release) (push) Successful in 43s
Builds / ExectOS (i686, debug) (push) Successful in 46s

The static local variable RingFlag in HlComPortReadLsr caused shared state across multiple calls and ports, leading to race conditions and incorrect behavior.
This commit is contained in:
Aiken Harris 2025-08-06 09:01:47 +02:00 committed by CodingWorkshop Signing Team
parent 9badf36ce0
commit d7552f1dce
Signed by: CodingWorkshop Signing Team
GPG Key ID: 6DC88369C82795D2

View File

@ -165,7 +165,6 @@ HlComPortReadLsr(IN PCPPORT Port,
IN UCHAR Byte) IN UCHAR Byte)
{ {
UCHAR Lsr, Msr; UCHAR Lsr, Msr;
STATIC UCHAR RingFlag;
/* Read the Line Status Register (LSR) */ /* Read the Line Status Register (LSR) */
Lsr = HlIoPortInByte(PtrToUshort(Port->Address + (ULONG)COMPORT_REG_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 */ /* Check Modem Status Register (MSR) for ring indicator */
Msr = HlIoPortInByte(PtrToUshort(Port->Address + (ULONG)COMPORT_REG_MSR)); Msr = HlIoPortInByte(PtrToUshort(Port->Address + (ULONG)COMPORT_REG_MSR));
RingFlag |= (Msr & COMPORT_MSR_RI) ? 1 : 2; Port->Ring |= (Msr & COMPORT_MSR_RI) ? 1 : 2;
if(RingFlag == 3) if(Port->Ring == 3)
{ {
/* Ring indicator toggled, use modem control */ /* Ring indicator toggled, use modem control */
Port->Flags |= COMPORT_FLAG_MC; Port->Flags |= COMPORT_FLAG_MC;
@ -283,6 +282,7 @@ HlInitializeComPort(IN OUT PCPPORT Port,
Port->Address = PortAddress; Port->Address = PortAddress;
Port->Baud = BaudRate; Port->Baud = BaudRate;
Port->Flags = Flags; Port->Flags = Flags;
Port->Ring = 0;
/* Return success */ /* Return success */
return STATUS_SUCCESS; return STATUS_SUCCESS;