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:
Sebastian Huber
2017-02-28 09:05:47 +01:00
parent 9fa0f543ec
commit c80f6aa916
2 changed files with 12 additions and 5 deletions
+9 -5
View File
@@ -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;
}
}
}
}
+3
View File
@@ -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');