From e19d94bea45b417078c6c08fd4081f913b743f08 Mon Sep 17 00:00:00 2001 From: Gerhard Rieger Date: Tue, 31 Mar 2009 21:58:30 +0200 Subject: [PATCH] fixed new bug with connect-timeout --- CHANGES | 5 +++++ VERSION | 2 +- test.sh | 51 +++++++++++++++++++++++++++++++++++++++++++++++++-- xio-socket.c | 8 ++++---- 4 files changed, 59 insertions(+), 7 deletions(-) diff --git a/CHANGES b/CHANGES index 4fe6ee3..652d036 100644 --- a/CHANGES +++ b/CHANGES @@ -1,4 +1,9 @@ +corrections: + fixed a bug, introduced with version 1.7.0.0, that let client + connections with option connect-timeout fail when the connections + succeeded. Thanks to Bruno De Fraine for reporting this bug. + ####################### V 1.7.0.0: new features: diff --git a/VERSION b/VERSION index bd51149..0da57b0 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -"1.7.0.0" +"1.7.0.0+connecttimeout" diff --git a/test.sh b/test.sh index 3ff4cfb..550be78 100755 --- a/test.sh +++ b/test.sh @@ -1,6 +1,6 @@ #! /bin/bash # source: test.sh -# Copyright Gerhard Rieger 2001-2008 +# Copyright Gerhard Rieger 2001-2009 # Published under the GNU General Public License V.2, see file COPYING # perform lots of tests on socat @@ -5697,7 +5697,7 @@ N=$((N+1)) NAME=CONNECTTIMEOUT case "$TESTS" in -*%functions%*|*%$NAME%*) +*%functions%*|*%ip4%*|*%ipapp%*|*%tcp%*|*%timeout%*|*%$NAME%*) TEST="$NAME: test the connect-timeout option" if ! eval $NUMCOND; then :; elif ! feat=$(testaddrs tcp); then @@ -5748,6 +5748,53 @@ esac N=$((N+1)) +# version 1.7.0.0 had a bug with the connect-timeout option: while it correctly +# terminated a hanging connect attempt, it prevented a successful connection +# establishment from being recognized by socat, instead the timeout occurred +NAME=CONNECTTIMEOUT_CONN +if ! eval $NUMCOND; then :; else +case "$TESTS" in +*%functions%*|*%ip4%*|*%ipapp%*|*%tcp%*|*%timeout%*|*%$NAME%*) +TEST="$NAME: TCP4 connect-timeout option when server replies" +# just try a connection that is expected to succeed with the usual data +# transfer; with the bug it will fail +tf="$td/test$N.stdout" +te="$td/test$N.stderr" +tdiff="$td/test$N.diff" +tsl=$PORT +ts="127.0.0.1:$tsl" +da="test$N $(date) $RANDOM" +CMD1="$SOCAT $opts TCP4-LISTEN:$tsl,reuseaddr PIPE" +CMD2="$SOCAT $opts STDIO TCP4:$ts,connect-timeout=1" +printf "test $F_n $TEST... " $N +$CMD1 >"$tf" 2>"${te}1" & +pid1=$! +waittcp4port $tsl 1 +echo "$da" |$CMD2 >>"$tf" 2>>"${te}2" +if [ $? -ne 0 ]; then + $PRINTF "$FAILED: $SOCAT:\n" + echo "$CMD1 &" + cat "${te}1" + echo "$CMD2" + cat "${te}2" + numFAIL=$((numFAIL+1)) +elif ! echo "$da" |diff - "$tf" >"$tdiff"; then + $PRINTF "$FAILED\n" + cat "$tdiff" + numFAIL=$((numFAIL+1)) +else + $PRINTF "$OK\n" + if [ -n "$debug" ]; then cat "${te}1" "${te}2"; fi + numOK=$((numOK+1)) +fi +kill $pid1 2>/dev/null +wait ;; +esac +PORT=$((PORT+1)) +fi # NUMCOND +N=$((N+1)) + + NAME=OPENSSLLISTENDSA case "$TESTS" in *%functions%*|*%$NAME%*) diff --git a/xio-socket.c b/xio-socket.c index a28710f..d35a165 100644 --- a/xio-socket.c +++ b/xio-socket.c @@ -1,5 +1,5 @@ /* source: xio-socket.c */ -/* Copyright Gerhard Rieger 2001-2008 */ +/* Copyright Gerhard Rieger 2001-2009 */ /* Published under the GNU General Public License V.2, see file COPYING */ /* this file contains the source for socket related functions, and the @@ -849,10 +849,10 @@ int _xioopen_connect(struct single *xfd, struct sockaddr *us, size_t uslen, themlen, strerror(errno)); timeout = xfd->para.socket.connect_timeout; writefd.fd = xfd->fd; - writefd.events = (POLLIN|POLLHUP|POLLERR); + writefd.events = (POLLOUT|POLLERR); result = xiopoll(&writefd, 1, &timeout); if (result < 0) { - Msg4(level, "xiopoll({%d,POLLIN|POLLHUP|POLLER},,{"F_tv_sec"."F_tv_usec"): %s", + Msg4(level, "xiopoll({%d,POLLOUT|POLLERR},,{"F_tv_sec"."F_tv_usec"): %s", xfd->fd, timeout.tv_sec, timeout.tv_usec, strerror(errno)); return STAT_RETRYLATER; } @@ -862,7 +862,7 @@ int _xioopen_connect(struct single *xfd, struct sockaddr *us, size_t uslen, strerror(ETIMEDOUT)); return STAT_RETRYLATER; } - if (writefd.revents & POLLOUT) { + if (writefd.revents & POLLERR) { #if 0 unsigned char dummy[1]; Read(xfd->fd, &dummy, 1); /* get error message */