From 42d3a50aa272ac9454ebe32f9b87fe496da37edf Mon Sep 17 00:00:00 2001 From: Tyler Veness Date: Tue, 9 Nov 2021 20:10:48 -0800 Subject: [PATCH] [hal] Check error codes during serial port initialization (#3712) Throw if serial port init fails. Fixes #2036. --- hal/src/main/native/athena/SerialPort.cpp | 27 ++++++++++++++++++----- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/hal/src/main/native/athena/SerialPort.cpp b/hal/src/main/native/athena/SerialPort.cpp index 374986b05c..7d32f19433 100644 --- a/hal/src/main/native/athena/SerialPort.cpp +++ b/hal/src/main/native/athena/SerialPort.cpp @@ -83,7 +83,7 @@ HAL_SerialPortHandle HAL_InitializeSerialPortDirect(HAL_SerialPort port, serialPort->portId = open(portName, O_RDWR | O_NOCTTY); if (serialPort->portId < 0) { - *status = errno; + *status = -errno; if (*status == EACCES) { *status = HAL_CONSOLE_OUT_ENABLED_ERROR; } @@ -94,8 +94,20 @@ HAL_SerialPortHandle HAL_InitializeSerialPortDirect(HAL_SerialPort port, std::memset(&serialPort->tty, 0, sizeof(serialPort->tty)); serialPort->baudRate = B9600; - cfsetospeed(&serialPort->tty, static_cast(serialPort->baudRate)); - cfsetispeed(&serialPort->tty, static_cast(serialPort->baudRate)); + if (cfsetospeed(&serialPort->tty, + static_cast(serialPort->baudRate)) != 0) { + *status = -errno; + close(serialPort->portId); + serialPortHandles->Free(handle); + return HAL_kInvalidHandle; + } + if (cfsetispeed(&serialPort->tty, + static_cast(serialPort->baudRate)) != 0) { + *status = -errno; + close(serialPort->portId); + serialPortHandles->Free(handle); + return HAL_kInvalidHandle; + } serialPort->tty.c_cflag &= ~PARENB; serialPort->tty.c_cflag &= ~CSTOPB; @@ -115,9 +127,14 @@ HAL_SerialPortHandle HAL_InitializeSerialPortDirect(HAL_SerialPort port, */ serialPort->tty.c_oflag = ~OPOST; - tcflush(serialPort->portId, TCIOFLUSH); + if (tcflush(serialPort->portId, TCIOFLUSH) != 0) { + *status = -errno; + close(serialPort->portId); + serialPortHandles->Free(handle); + return HAL_kInvalidHandle; + } if (tcsetattr(serialPort->portId, TCSANOW, &serialPort->tty) != 0) { - *status = errno; + *status = -errno; close(serialPort->portId); serialPortHandles->Free(handle); return HAL_kInvalidHandle;