summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2017-02-24 10:29:05 +0100
committerSebastian Huber <sebastian.huber@embedded-brains.de>2017-02-28 09:05:47 +0100
commitc80f6aa9161e10259127b3b9abe7717c702daf39 (patch)
treefa83592d69bfdcf41bf15cc932636e2f4f19ed3d
parenttermios: Change receive callback invocation (diff)
downloadrtems-c80f6aa9161e10259127b3b9abe7717c702daf39.tar.bz2
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.
-rw-r--r--cpukit/libcsupport/src/termios.c14
-rw-r--r--testsuites/libtests/termios09/init.c3
2 files changed, 12 insertions, 5 deletions
diff --git a/cpukit/libcsupport/src/termios.c b/cpukit/libcsupport/src/termios.c
index 62964e4747..f5bf493966 100644
--- a/cpukit/libcsupport/src/termios.c
+++ b/cpukit/libcsupport/src/termios.c
@@ -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;
+ }
}
}
}
diff --git a/testsuites/libtests/termios09/init.c b/testsuites/libtests/termios09/init.c
index a32ebdaec5..980a6ea9ec 100644
--- a/testsuites/libtests/termios09/init.c
+++ b/testsuites/libtests/termios09/init.c
@@ -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');