Socat printed the "socket ... is at EOF" message multiple times

This commit is contained in:
Gerhard Rieger 2019-12-30 10:05:33 +01:00
parent 3be18bdc1f
commit 12f7833a8f
4 changed files with 49 additions and 5 deletions

View file

@ -26,6 +26,10 @@ Corrections:
Test: IP_SENDTO_6 Test: IP_SENDTO_6
Thanks to Sören for sending an initial patch. Thanks to Sören for sending an initial patch.
Under certain circumstances, Socat printed the "socket ... is at EOF"
multiple times.
Test: MULTIPLE_EOF
####################### V 1.7.3.3: ####################### V 1.7.3.3:
Corrections: Corrections:

View file

@ -1076,10 +1076,10 @@ int _socat(void) {
XIO_RDSTREAM(sock1)->fd); /*! */ XIO_RDSTREAM(sock1)->fd); /*! */
mayrd1 = true; mayrd1 = true;
polling = 1; /* do not hook this eof fd to poll for pollintv*/ polling = 1; /* do not hook this eof fd to poll for pollintv*/
} else { } else if (XIO_RDSTREAM(sock1)->eof <= 2) {
Notice1("socket 1 (fd %d) is at EOF", XIO_GETRDFD(sock1)); Notice1("socket 1 (fd %d) is at EOF", XIO_GETRDFD(sock1));
xioshutdown(sock2, SHUT_WR); xioshutdown(sock2, SHUT_WR);
XIO_RDSTREAM(sock1)->eof = 2; XIO_RDSTREAM(sock1)->eof = 3;
XIO_RDSTREAM(sock1)->ignoreeof = false; XIO_RDSTREAM(sock1)->ignoreeof = false;
} }
} else if (polling && XIO_RDSTREAM(sock1)->ignoreeof) { } else if (polling && XIO_RDSTREAM(sock1)->ignoreeof) {
@ -1099,10 +1099,10 @@ int _socat(void) {
XIO_RDSTREAM(sock2)->fd); XIO_RDSTREAM(sock2)->fd);
mayrd2 = true; mayrd2 = true;
polling = 1; /* do not hook this eof fd to poll for pollintv*/ polling = 1; /* do not hook this eof fd to poll for pollintv*/
} else { } else if (XIO_RDSTREAM(sock2)->eof <= 2) {
Notice1("socket 2 (fd %d) is at EOF", XIO_GETRDFD(sock2)); Notice1("socket 2 (fd %d) is at EOF", XIO_GETRDFD(sock2));
xioshutdown(sock1, SHUT_WR); xioshutdown(sock1, SHUT_WR);
XIO_RDSTREAM(sock2)->eof = 2; XIO_RDSTREAM(sock2)->eof = 3;
XIO_RDSTREAM(sock2)->ignoreeof = false; XIO_RDSTREAM(sock2)->ignoreeof = false;
} }
} else if (polling && XIO_RDSTREAM(sock2)->ignoreeof) { } else if (polling && XIO_RDSTREAM(sock2)->ignoreeof) {

39
test.sh
View file

@ -13094,6 +13094,45 @@ esac
N=$((N+1)) N=$((N+1))
# test if the multiple EOF messages are fixed
NAME=MULTIPLE_EOF
case "$TESTS" in
*%$N%*|*%functions%*|*%bugs%*|*%unix%*|*%socket%*|*%$NAME%*)
TEST="$NAME: multiple EOF messages"
# start two processes, connected via UNIX socket. The listener gets EOF from local address immediately; the second process then sends data. If the listener reports "socket 1 (fd .*) is at EOF" only once, the test succeeded
if ! eval $NUMCOND; then :; else
ts="$td/test$N.sock"
tf="$td/test$N.stdout"
te="$td/test$N.stderr"
tdiff="$td/test$N.diff"
da="test$N $(date) $RANDOM"
CMD0="$TRACE $SOCAT $opts -d -d UNIX-LISTEN:$ts /dev/null"
CMD1="$TRACE $SOCAT $opts -d -d - UNIX-CONNECT:$ts"
printf "test $F_n $TEST... " $N
$CMD0 >/dev/null 2>"${te}0" &
pid0=$!
waitunixport $ts 1
echo "$da" |$CMD1 >"${tf}1" 2>"${te}1"
rc1=$?
kill $pid0 2>/dev/null; wait
if [ $(grep "socket 2 (fd .*) is at EOF" ${te}0 |wc -l) -eq 1 ]; then
$PRINTF "$OK\n"
numOK=$((numOK+1))
else
$PRINTF "$FAILED\n"
echo "$CMD0 &"
echo "$CMD1"
cat "${te}0"
cat "${te}1"
numFAIL=$((numFAIL+1))
listFAIL="$listFAIL $N"
fi
fi # NUMCOND
;;
esac
N=$((N+1))
################################################################################## ##################################################################################
#================================================================================= #=================================================================================
# here come tests that might affect your systems integrity. Put normal tests # here come tests that might affect your systems integrity. Put normal tests

3
xio.h
View file

@ -129,7 +129,8 @@ typedef struct single {
bool ignoreeof; /* option ignoreeof; do not pass eof condition to app*/ bool ignoreeof; /* option ignoreeof; do not pass eof condition to app*/
int eof; /* 1..exec'd child has died, but no explicit eof int eof; /* 1..exec'd child has died, but no explicit eof
occurred occurred
2..fd0 has reached EOF (definitely; never with 2..fd0 has reached EOF, but check for ignoreeof
3..fd0 has reached EOF (definitely; never with
ignoreeof! */ ignoreeof! */
size_t wsize; /* write always this size; 0..all available */ size_t wsize; /* write always this size; 0..all available */
size_t readbytes; /* read only so many bytes; 0...unlimited */ size_t readbytes; /* read only so many bytes; 0...unlimited */