mirror of
https://repo.or.cz/socat.git
synced 2024-12-22 23:42:34 +00:00
fixes multiple xioshutdown() calls
This commit is contained in:
parent
aa678f0a6e
commit
405a98c0b5
2 changed files with 29 additions and 25 deletions
30
test.sh
30
test.sh
|
@ -2207,7 +2207,7 @@ N=$((N+1))
|
|||
|
||||
NAME=FILE
|
||||
case "$TESTS" in
|
||||
*%functions%*|*%file%*|*%ignoreeof%*|*%$NAME%*)
|
||||
*%functions%*|*%engine%*|*%file%*|*%ignoreeof%*|*%$NAME%*)
|
||||
TEST="$NAME: simple echo via file"
|
||||
tf="$td/file$N"
|
||||
testecho "$N" "$TEST" "" "$tf%$tf,ignoreeof" "$opts"
|
||||
|
@ -3244,7 +3244,7 @@ N=$((N+1))
|
|||
|
||||
NAME=GOPENFILE
|
||||
case "$TESTS" in
|
||||
*%functions%*|*%gopen%*|*%file%*|*%ignoreeof%*|*%$NAME%*)
|
||||
*%functions%*|*%engine%*|*%gopen%*|*%file%*|*%ignoreeof%*|*%$NAME%*)
|
||||
TEST="$NAME: file opening with gopen"
|
||||
if ! eval $NUMCOND; then :; else
|
||||
tf1="$td/test$N.1.stdout"
|
||||
|
@ -3277,7 +3277,7 @@ N=$((N+1))
|
|||
|
||||
NAME=GOPENPIPE
|
||||
case "$TESTS" in
|
||||
*%functions%*|*%gopen%*|*%pipe%*|*%ignoreeof%*|*%$NAME%*)
|
||||
*%functions%*|*%engine%*|*%gopen%*|*%pipe%*|*%ignoreeof%*|*%$NAME%*)
|
||||
TEST="$NAME: pipe opening with gopen for reading"
|
||||
if ! eval $NUMCOND; then :; else
|
||||
tp="$td/pipe$N"
|
||||
|
@ -3423,7 +3423,7 @@ N=$((N+1))
|
|||
#set -vx
|
||||
NAME=IGNOREEOF
|
||||
case "$TESTS" in
|
||||
*%functions%*|*%ignoreeof%*|*%$NAME%*)
|
||||
*%functions%*|*%engine%*|*%ignoreeof%*|*%$NAME%*)
|
||||
TEST="$NAME: ignoreeof on file"
|
||||
if ! eval $NUMCOND; then :; else
|
||||
ti="$td/test$N.file"
|
||||
|
@ -3458,7 +3458,7 @@ set +vx
|
|||
|
||||
NAME=EXECIGNOREEOF
|
||||
case "$TESTS" in
|
||||
*%functions%*|*%ignoreeof%*|*%$NAME%*)
|
||||
*%functions%*|*%engine%*|*%ignoreeof%*|*%$NAME%*)
|
||||
TEST="$NAME: exec against address with ignoreeof"
|
||||
if ! eval $NUMCOND; then :; else
|
||||
tf="$td/test$N.stdout"
|
||||
|
@ -4514,7 +4514,7 @@ N=$((N+1))
|
|||
|
||||
NAME=TOTALTIMEOUT
|
||||
case "$TESTS" in
|
||||
*%functions%*|*%timeout%*|*%$NAME%*)
|
||||
*%functions%*|*%engine%*|*%timeout%*|*%$NAME%*)
|
||||
TEST="$NAME: socat inactivity timeout"
|
||||
if ! eval $NUMCOND; then :; else
|
||||
#set -vx
|
||||
|
@ -4553,7 +4553,7 @@ N=$((N+1))
|
|||
|
||||
NAME=IGNOREEOF+TOTALTIMEOUT
|
||||
case "$TESTS" in
|
||||
*%functions%*|*%timeout%*|*%ignoreeof%*|*%$NAME%*)
|
||||
*%functions%*|*%engine%*|*%timeout%*|*%ignoreeof%*|*%$NAME%*)
|
||||
TEST="$NAME: ignoreeof and inactivity timeout"
|
||||
if ! eval $NUMCOND; then :; else
|
||||
#set -vx
|
||||
|
@ -6187,7 +6187,7 @@ N=$((N+1))
|
|||
|
||||
NAME=UNIXTODGRAM
|
||||
case "$TESTS" in
|
||||
*%functions%*|*%unix%*|*%recv%*|*%$NAME%*)
|
||||
*%functions%*|*%engine%*|*%unix%*|*%recv%*|*%$NAME%*)
|
||||
TEST="$NAME: generic UNIX client connects to datagram socket"
|
||||
if ! eval $NUMCOND; then :; else
|
||||
ts1="$td/test$N.socket1"
|
||||
|
@ -6569,7 +6569,7 @@ fi #false
|
|||
|
||||
NAME=UNIXDGRAM
|
||||
case "$TESTS" in
|
||||
*%functions%*|*%unix%*|*%dgram%*|*%$NAME%*)
|
||||
*%functions%*|*%engine%*|*%unix%*|*%dgram%*|*%$NAME%*)
|
||||
TEST="$NAME: UNIX datagram"
|
||||
if ! eval $NUMCOND; then :; else
|
||||
tf="$td/test$N.stdout"
|
||||
|
@ -6611,7 +6611,7 @@ N=$((N+1))
|
|||
|
||||
NAME=UDP4RECV
|
||||
case "$TESTS" in
|
||||
*%functions%*|*%ip4%*|*%dgram%*|*%udp%*|*%udp4%*|*%recv%*|*%$NAME%*)
|
||||
*%functions%*|*%engine%*|*%ip4%*|*%dgram%*|*%udp%*|*%udp4%*|*%recv%*|*%$NAME%*)
|
||||
TEST="$NAME: UDP/IPv4 receive"
|
||||
if ! eval $NUMCOND; then :; else
|
||||
tf="$td/test$N.stdout"
|
||||
|
@ -7495,7 +7495,7 @@ N=$((N+1))
|
|||
|
||||
NAME=COOLWRITE
|
||||
case "$TESTS" in
|
||||
*%functions%*|*%timeout%*|*%ignoreeof%*|*%coolwrite%*|*%$NAME%*)
|
||||
*%functions%*|*%engine%*|*%timeout%*|*%ignoreeof%*|*%coolwrite%*|*%$NAME%*)
|
||||
TEST="$NAME: option cool-write"
|
||||
if ! eval $NUMCOND; then :;
|
||||
elif ! testoptions cool-write >/dev/null; then
|
||||
|
@ -7537,7 +7537,7 @@ N=$((N+1))
|
|||
# this failed up to socat 1.6.0.0
|
||||
NAME=COOLSTDIO
|
||||
case "$TESTS" in
|
||||
*%functions%*|*%timeout%*|*%ignoreeof%*|*%coolwrite%*|*%$NAME%*)
|
||||
*%functions%*|*%engine%*|*%timeout%*|*%ignoreeof%*|*%coolwrite%*|*%$NAME%*)
|
||||
TEST="$NAME: option cool-write on bidirectional stdio"
|
||||
# this test starts a socat reader that terminates after receiving one+
|
||||
# bytes (option readbytes); and a test process that sends two bytes via
|
||||
|
@ -9029,7 +9029,7 @@ N=$((N+1))
|
|||
# the reverse direction
|
||||
NAME=IGNOREEOFNOBLOCK
|
||||
case "$TESTS" in
|
||||
*%functions%*|*%socket%*|*%ignoreeof%*|*%$NAME%*)
|
||||
*%functions%*|*%engine%*|*%socket%*|*%ignoreeof%*|*%$NAME%*)
|
||||
TEST="$NAME: ignoreeof does not block other direction"
|
||||
# have socat poll in ignoreeof mode. while it waits one second for next check,
|
||||
# we send data in the reverse direction and then the total timeout fires.
|
||||
|
@ -9068,7 +9068,7 @@ N=$((N+1))
|
|||
# test the escape option
|
||||
NAME=ESCAPE
|
||||
case "$TESTS" in
|
||||
*%functions%*|*%escape%*|*%$NAME%*)
|
||||
*%functions%*|*%engine%*|*%escape%*|*%$NAME%*)
|
||||
TEST="$NAME: escape character triggers EOF"
|
||||
# idea: start socat just echoing input, but apply escape option. send a string
|
||||
# containing the escape character and check if the output is truncated
|
||||
|
@ -9101,7 +9101,7 @@ N=$((N+1))
|
|||
# test the escape option combined with ignoreeof
|
||||
NAME=ESCAPE_IGNOREEOF
|
||||
case "$TESTS" in
|
||||
*%functions%*|*%ignoreeof%*|*%escape%*|*%$NAME%*)
|
||||
*%functions%*|*%engine%*|*%ignoreeof%*|*%escape%*|*%$NAME%*)
|
||||
TEST="$NAME: escape character triggers EOF"
|
||||
# idea: start socat just echoing input, but apply escape option. send a string
|
||||
# containing the escape character and check if the output is truncated
|
||||
|
|
24
xioengine.c
24
xioengine.c
|
@ -436,7 +436,7 @@ int _socat(xiofile_t *xfd1, xiofile_t *xfd2) {
|
|||
|
||||
/* NOW handle EOFs */
|
||||
|
||||
if (bytes1 == 0 || XIO_RDSTREAM(sock1)->eof >= 2) {
|
||||
if (bytes1 == 0) {
|
||||
if (XIO_RDSTREAM(sock1)->ignoreeof &&
|
||||
!XIO_RDSTREAM(sock1)->actescape && !sock1->stream.closing) {
|
||||
Debug1("socket 1 (fd %d) is at EOF, ignoring",
|
||||
|
@ -448,16 +448,18 @@ int _socat(xiofile_t *xfd1, xiofile_t *xfd2) {
|
|||
xioshutdown(sock2, SHUT_WR);
|
||||
XIO_RDSTREAM(sock1)->eof = 2;
|
||||
XIO_RDSTREAM(sock1)->ignoreeof = false;
|
||||
sock2->stream.closing = MAX(sock2->stream.closing, 1);
|
||||
if (/*0 xioparams->lefttoright*/ !XIO_READABLE(sock2)) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
} else if (polling && XIO_RDSTREAM(sock1)->ignoreeof) {
|
||||
polling = 0;
|
||||
}
|
||||
if (XIO_RDSTREAM(sock1)->eof >= 2) {
|
||||
sock2->stream.closing = MAX(sock2->stream.closing, 1);
|
||||
if (!XIO_READABLE(sock2)) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (bytes2 == 0 || XIO_RDSTREAM(sock2)->eof >= 2) {
|
||||
if (bytes2 == 0) {
|
||||
if (XIO_RDSTREAM(sock2)->ignoreeof &&
|
||||
!XIO_RDSTREAM(sock2)->actescape && !sock2->stream.closing) {
|
||||
Debug1("socket 2 (fd %d) is at EOF, ignoring",
|
||||
|
@ -469,14 +471,16 @@ int _socat(xiofile_t *xfd1, xiofile_t *xfd2) {
|
|||
xioshutdown(sock1, SHUT_WR);
|
||||
XIO_RDSTREAM(sock2)->eof = 2;
|
||||
XIO_RDSTREAM(sock2)->ignoreeof = false;
|
||||
sock1->stream.closing = MAX(sock1->stream.closing, 1);
|
||||
if (/*0 xioparams->righttoleft*/ !XIO_READABLE(sock1)) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
} else if (polling && XIO_RDSTREAM(sock2)->ignoreeof) {
|
||||
polling = 0;
|
||||
}
|
||||
if (XIO_RDSTREAM(sock2)->eof >= 2) {
|
||||
sock1->stream.closing = MAX(sock1->stream.closing, 1);
|
||||
if (!XIO_READABLE(sock1)) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* close everything that's still open */
|
||||
|
|
Loading…
Reference in a new issue