Package: expect
Version: 5.45-6
Severity: normal
Tags: patch
Sometimes fake EOFs occur when running with a multi-byte locales over
serial ports. The reason is when Tcl_ReadChars() returns 0 it is
considered EOF in expRead().
When select() detects there is at least one byte available, it does not
mean a multibyte-locale character is also available because it may be
incomplete, so Tcl_ReadChars() may return 0 and it is not an EOF
condition, therefore explicit check of EOF is needed.
-- System Information:
Debian Release: 8.2
APT prefers stable-updates
APT policy: (500, 'stable-updates'), (500, 'stable')
Architecture: amd64 (x86_64)
Kernel: Linux 3.16.0-4-amd64 (SMP w/4 CPU cores)
Locale: LANG=ru_RU.UTF-8, LC_CTYPE=ru_RU.UTF-8 (charmap=UTF-8)
Shell: /bin/sh linked to /bin/dash
Init: systemd (via /run/systemd/system)
Versions of packages expect depends on:
ii libc6 2.19-18+deb8u1
ii libtcl8.6 8.6.2+dfsg-2
ii tcl-expect 5.45-6
Versions of packages expect recommends:
ii tcl8.6 8.6.4+dfsg-2
ii tk8.6 8.6.2-1
expect suggests no packages.
-- no debconf information
Index: expect-5.45/expect.c
===================================================================
--- expect-5.45.orig/expect.c
+++ expect-5.45/expect.c
@@ -1863,7 +1863,11 @@ expRead(
/* little, so that from now on it means "no new data arrived */
/* but it should be looked at again anyway". */
if (cc == 0) {
- cc = EXP_EOF;
+ /* the meaning of 0 from i_read just may mean eof. So, whether */
+ /* the eof condition really exists must be checked explicitly. */
+ if (Tcl_Eof(esPtr->channel)) {
+ cc = EXP_EOF;
+ }
} else if (cc > 0) {
/* successfully read data */
} else {