mirror of
https://gitlab.rtems.org/rtems/rtos/rtems.git
synced 2026-09-20 21:56:06 +08:00
termios: Fix infinite loop in receive path
In canonical mode, the raw input buffer or the canonical buffer may overflow without an end of line. Avoid an infinite loop in this case. Close #2915.
This commit is contained in:
@@ -1504,13 +1504,17 @@ fillBufferQueue (struct rtems_termios_tty *tty)
|
||||
/*
|
||||
* Wait for characters
|
||||
*/
|
||||
if ( wait ) {
|
||||
rtems_status_code sc;
|
||||
if (wait) {
|
||||
if (tty->ccount < CBUFSIZE - 1) {
|
||||
rtems_status_code sc;
|
||||
|
||||
sc = rtems_semaphore_obtain(
|
||||
tty->rawInBuf.Semaphore, tty->rawInBufSemaphoreOptions, timeout);
|
||||
if (sc != RTEMS_SUCCESSFUL)
|
||||
sc = rtems_semaphore_obtain(
|
||||
tty->rawInBuf.Semaphore, tty->rawInBufSemaphoreOptions, timeout);
|
||||
if (sc != RTEMS_SUCCESSFUL)
|
||||
break;
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -550,6 +550,9 @@ static void test_rx_callback_icanon(test_context *ctx)
|
||||
input(ctx, i, 'e');
|
||||
rtems_test_assert(dev->callback_counter == 5);
|
||||
|
||||
n = read(ctx->fds[i], buf, 255);
|
||||
rtems_test_assert(n == 255);
|
||||
|
||||
dev->tty->tty_rcv.sw_pfn = NULL;
|
||||
dev->tty->tty_rcv.sw_arg = NULL;
|
||||
set_veol_veol2(ctx, i, '\0', '\0');
|
||||
|
||||
Reference in New Issue
Block a user