Test of EXEC,SYSTEM with socktype=<SOCK_DGRAM>

This commit is contained in:
Gerhard Rieger 2023-06-11 22:27:12 +02:00
parent 41b5da75ac
commit 30ace16174
2 changed files with 117 additions and 49 deletions

View file

@ -4,6 +4,11 @@ Coding:
starting the data transfer loop. Useful, e.g., to accumulate multiple starting the data transfer loop. Useful, e.g., to accumulate multiple
packets in a receiving datagram socket before starting to process them. packets in a receiving datagram socket before starting to process them.
Testing:
Idea: EXEC,SYSTEM addresses can keep packet boundaries when option
socktype=<val-of-SOCK_DGRAM>
Tests: EXECSOCKETPAIRPACKETS SYSTEMSOCKETPAIRPACKETS
####################### V 1.7.4.4: ####################### V 1.7.4.4:
Corrections: Corrections:

161
test.sh
View file

@ -116,6 +116,16 @@ PORT=12002
SOURCEPORT=2002 SOURCEPORT=2002
REUSEADDR=reuseaddr # use this with LISTEN addresses and bind options REUSEADDR=reuseaddr # use this with LISTEN addresses and bind options
# get some system constants for use in tests
SOCK_DGRAM="$($PROCAN -c |grep "^#define[[:space:]]*SOCK_DGRAM[[:space:]]" |cut -d' ' -f3)"
FOPEN_MAX=$($PROCAN -c 2>/dev/null |grep '^#define[ ][ ]*FOPEN_MAX' |awk '{print($3);}')
PF_INET6="$($PROCAN -c |grep "^#define[[:space:]]*PF_INET6[[:space:]]" |cut -d' ' -f3)"
TIOCEXCL="$($PROCAN -c |grep "^#define[[:space:]]*TIOCEXCL[[:space:]]" |cut -d' ' -f3)"
SOL_SOCKET="$($PROCAN -c |grep "^#define[[:space:]]*SOL_SOCKET[[:space:]]" |cut -d' ' -f3)"
SO_REUSEADDR="$($PROCAN -c |grep "^#define[[:space:]]*SO_REUSEADDR[[:space:]]" |cut -d' ' -f3)"
TCP_MAXSEG="$($PROCAN -c |grep "^#define[[:space:]]*TCP_MAXSEG[[:space:]]" |cut -d' ' -f3)"
SIZE_T=$($PROCAN |grep size_t |awk '{print($3);}')
# SSL certificate contents # SSL certificate contents
TESTCERT_CONF=testcert.conf TESTCERT_CONF=testcert.conf
TESTCERT6_CONF=testcert6.conf TESTCERT6_CONF=testcert6.conf
@ -2639,38 +2649,36 @@ esac
N=$((N+1)) N=$((N+1))
NAME=EXECSOCKET NAME=EXECSOCKETPAIR
case "$TESTS" in case "$TESTS" in
*%$N%*|*%functions%*|*%exec%*|*%$NAME%*) *%$N%*|*%functions%*|*%exec%*|*%socketpair%*|*%$NAME%*)
TEST="$NAME: simple echo via exec of cat with socketpair" TEST="$NAME: simple echo via exec of cat with socketpair"
testecho "$N" "$TEST" "" "exec:$CAT" "$opts" testecho "$N" "$TEST" "" "EXEC:$CAT" "$opts"
esac esac
N=$((N+1)) N=$((N+1))
NAME=SYSTEMSOCKETPAIR
NAME=SYSTEMSOCKET
case "$TESTS" in case "$TESTS" in
*%$N%*|*%functions%*|*%system%*|*%$NAME%*) *%$N%*|*%functions%*|*%system%*|*%socketpair%*|*%$NAME%*)
TEST="$NAME: simple echo via system() of cat with socketpair" TEST="$NAME: simple echo via system() of cat with socketpair"
testecho "$N" "$TEST" "" "system:$CAT" "$opts" "$val_t" testecho "$N" "$TEST" "" "SYSTEM:$CAT" "$opts" "$val_t"
esac esac
N=$((N+1)) N=$((N+1))
NAME=EXECPIPES NAME=EXECPIPES
case "$TESTS" in case "$TESTS" in
*%$N%*|*%functions%*|*%pipe%*|*%$NAME%*) *%$N%*|*%functions%*|*%exec%*|*%pipe%*|*%$NAME%*)
TEST="$NAME: simple echo via exec of cat with pipes" TEST="$NAME: simple echo via exec of cat with pipes"
testecho "$N" "$TEST" "" "exec:$CAT,pipes" "$opts" testecho "$N" "$TEST" "" "EXEC:$CAT,pipes" "$opts"
esac esac
N=$((N+1)) N=$((N+1))
NAME=SYSTEMPIPES NAME=SYSTEMPIPES
case "$TESTS" in case "$TESTS" in
*%$N%*|*%functions%*|*%pipes%*|*%$NAME%*) *%$N%*|*%functions%*|*%system%*|*%pipes%*|*%$NAME%*)
TEST="$NAME: simple echo via system() of cat with pipes" TEST="$NAME: simple echo via system() of cat with pipes"
testecho "$N" "$TEST" "" "system:$CAT,pipes" "$opts" testecho "$N" "$TEST" "" "sYSTEM:$CAT,pipes" "$opts"
esac esac
N=$((N+1)) N=$((N+1))
@ -2685,12 +2693,11 @@ elif ! testfeats pty >/dev/null; then
numCANT=$((numCANT+1)) numCANT=$((numCANT+1))
listCANT="$listCANT $N" listCANT="$listCANT $N"
else else
testecho "$N" "$TEST" "" "exec:$CAT,pty,$PTYOPTS,$PTYOPTS2" "$opts" testecho "$N" "$TEST" "" "EXEC:$CAT,pty,$PTYOPTS,$PTYOPTS2" "$opts"
fi fi
esac esac
N=$((N+1)) N=$((N+1))
NAME=SYSTEMPTY NAME=SYSTEMPTY
case "$TESTS" in case "$TESTS" in
*%$N%*|*%functions%*|*%system%*|*%pty%*|*%$NAME%*) *%$N%*|*%functions%*|*%system%*|*%pty%*|*%$NAME%*)
@ -2701,7 +2708,7 @@ elif ! testfeats pty >/dev/null; then
numCANT=$((numCANT+1)) numCANT=$((numCANT+1))
listCANT="$listCANT $N" listCANT="$listCANT $N"
else else
testecho "$N" "$TEST" "" "system:$CAT,pty,$PTYOPTS,$PTYOPTS2" "$opts" testecho "$N" "$TEST" "" "SYSTEM:$CAT,pty,$PTYOPTS,$PTYOPTS2" "$opts"
fi fi
esac esac
N=$((N+1)) N=$((N+1))
@ -2709,58 +2716,56 @@ N=$((N+1))
NAME=SYSTEMPIPESFDS NAME=SYSTEMPIPESFDS
case "$TESTS" in case "$TESTS" in
*%$N%*|*%functions%*|*%system%*|*%$NAME%*) *%$N%*|*%functions%*|*%system%*|*%pipes%*|*%$NAME%*)
TEST="$NAME: simple echo via system() of cat with pipes, non stdio" TEST="$NAME: simple echo via system() of cat with pipes, non stdio"
testecho "$N" "$TEST" "" "system:$CAT>&9 <&8,pipes,fdin=8,fdout=9" "$opts" testecho "$N" "$TEST" "" "SYSTEM:$CAT>&9 <&8,pipes,fdin=8,fdout=9" "$opts"
esac esac
N=$((N+1)) N=$((N+1))
NAME=DUALSYSTEMFDS NAME=DUALSYSTEMFDS
case "$TESTS" in case "$TESTS" in
*%$N%*|*%functions%*|*%system%*|*%$NAME%*) *%$N%*|*%functions%*|*%system%*|*%socketpair%*|*%$NAME%*)
TEST="$NAME: echo via dual system() of cat" TEST="$NAME: echo via dual system() of cat"
testecho "$N" "$TEST" "system:$CAT>&6,fdout=6!!system:$CAT<&7,fdin=7" "" "$opts" "$val_t" testecho "$N" "$TEST" "SYSTEM:$CAT>&6,fdout=6!!system:$CAT<&7,fdin=7" "" "$opts" "$val_t"
esac esac
N=$((N+1)) N=$((N+1))
# test: send EOF to exec'ed sub process, let it finish its operation, and # test: send EOF to exec'ed sub process, let it finish its operation, and
# check if the sub process returns its data before terminating. # check if the sub process returns its data before terminating.
NAME=EXECSOCKETFLUSH NAME=EXECSOCKETPAIRFLUSH
# idea: have socat exec'ing od; send data and EOF, and check if the od'ed data # idea: have socat exec'ing od; send data and EOF, and check if the od'ed data
# arrives. # arrives.
case "$TESTS" in case "$TESTS" in
*%$N%*|*%functions%*|*%exec%*|*%$NAME%*) *%$N%*|*%functions%*|*%exec%*|*%socketpair%*|*%$NAME%*)
TEST="$NAME: call to od via exec with socketpair" TEST="$NAME: call to od via exec with socketpair"
testod "$N" "$TEST" "" "exec:$OD_C" "$opts" testod "$N" "$TEST" "" "EXEC:$OD_C" "$opts"
esac esac
N=$((N+1)) N=$((N+1))
NAME=SYSTEMSOCKETPAIRFLUSH
NAME=SYSTEMSOCKETFLUSH
case "$TESTS" in case "$TESTS" in
*%$N%*|*%functions%*|*%system%*|*%$NAME%*) *%$N%*|*%functions%*|*%system%*|*%socketpair%*|*%$NAME%*)
TEST="$NAME: call to od via system() with socketpair" TEST="$NAME: call to od via system() with socketpair"
testod "$N" "$TEST" "" "system:$OD_C" "$opts" $val_t testod "$N" "$TEST" "" "SYSTEM:$OD_C" "$opts" $val_t
esac esac
N=$((N+1)) N=$((N+1))
NAME=EXECPIPESFLUSH NAME=EXECPIPESFLUSH
case "$TESTS" in case "$TESTS" in
*%$N%*|*%functions%*|*%exec%*|*%$NAME%*) *%$N%*|*%functions%*|*%exec%*|*%pipes%*|*%$NAME%*)
TEST="$NAME: call to od via exec with pipes" TEST="$NAME: call to od via EXEC with pipes"
testod "$N" "$TEST" "" "exec:$OD_C,pipes" "$opts" testod "$N" "$TEST" "" "EXEC:$OD_C,pipes" "$opts"
esac esac
N=$((N+1)) N=$((N+1))
NAME=SYSTEMPIPESFLUSH NAME=SYSTEMPIPESFLUSH
case "$TESTS" in case "$TESTS" in
*%$N%*|*%functions%*|*%system%*|*%$NAME%*) *%$N%*|*%functions%*|*%system%*|*%pipes%*|*%$NAME%*)
TEST="$NAME: call to od via system() with pipes" TEST="$NAME: call to od via system() with pipes"
testod "$N" "$TEST" "" "system:$OD_C,pipes" "$opts" "$val_t" testod "$N" "$TEST" "" "SYSTEM:$OD_C,pipes" "$opts" "$val_t"
esac esac
N=$((N+1)) N=$((N+1))
@ -2799,18 +2804,17 @@ N=$((N+1))
NAME=SYSTEMPIPESFDSFLUSH NAME=SYSTEMPIPESFDSFLUSH
case "$TESTS" in case "$TESTS" in
*%$N%*|*%functions%*|*%system%*|*%$NAME%*) *%$N%*|*%functions%*|*%system%*|*%pipes%*|*%$NAME%*)
TEST="$NAME: call to od via system() with pipes, non stdio" TEST="$NAME: call to od via system() with pipes, non stdio"
testod "$N" "$TEST" "" "system:$OD_C>&9 <&8,pipes,fdin=8,fdout=9" "$opts" "$val_t" testod "$N" "$TEST" "" "SYSTEM:$OD_C>&9 <&8,pipes,fdin=8,fdout=9" "$opts" "$val_t"
esac esac
N=$((N+1)) N=$((N+1))
NAME=DUALSYSTEMFDSFLUSH NAME=DUALSYSTEMFDSFLUSH
case "$TESTS" in case "$TESTS" in
*%$N%*|*%functions%*|*%system%*|*%$NAME%*) *%$N%*|*%functions%*|*%system%*|*%pipes%*|*%$NAME%*)
TEST="$NAME: call to od via dual system()" TEST="$NAME: call to od via dual system()"
testod "$N" "$TEST" "system:$OD_C>&6,fdout=6!!system:$CAT<&7,fdin=7" "pipe" "$opts" "$val_t" testod "$N" "$TEST" "SYSTEM:$OD_C>&6,fdout=6!!SYSTEM:$CAT<&7,fdin=7" "pipe" "$opts" "$val_t"
esac esac
N=$((N+1)) N=$((N+1))
@ -9900,7 +9904,6 @@ elif [ "$UNAME" != Linux ]; then
else else
REDIR= REDIR=
#set -vx #set -vx
FOPEN_MAX=$($PROCAN -c 2>/dev/null |grep '^#define[ ][ ]*FOPEN_MAX' |awk '{print($3);}')
if [ -z "$FOPEN_MAX" ]; then if [ -z "$FOPEN_MAX" ]; then
$PRINTF "test $F_n $TEST... ${YELLOW}could not determine FOPEN_MAX${NORMAL}\n" "$N" $PRINTF "test $F_n $TEST... ${YELLOW}could not determine FOPEN_MAX${NORMAL}\n" "$N"
numCANT=$((numCANT+1)) numCANT=$((numCANT+1))
@ -10818,7 +10821,6 @@ esac
PORT=$((PORT+1)) PORT=$((PORT+1))
N=$((N+1)) N=$((N+1))
PF_INET6="$($PROCAN -c |grep "^#define[[:space:]]*PF_INET6[[:space:]]" |cut -d' ' -f3)"
# test the SOCKET-CONNECT address (against TCP6-LISTEN) # test the SOCKET-CONNECT address (against TCP6-LISTEN)
NAME=SOCKET_CONNECT_TCP6 NAME=SOCKET_CONNECT_TCP6
@ -10984,8 +10986,6 @@ esac
PORT=$((PORT+1)) PORT=$((PORT+1))
N=$((N+1)) N=$((N+1))
SOCK_DGRAM="$($PROCAN -c |grep "^#define[[:space:]]*SOCK_DGRAM[[:space:]]" |cut -d' ' -f3)"
# test the SOCKET-SENDTO address (against UDP4-RECVFROM) # test the SOCKET-SENDTO address (against UDP4-RECVFROM)
NAME=SOCKET_SENDTO NAME=SOCKET_SENDTO
case "$TESTS" in case "$TESTS" in
@ -11227,8 +11227,6 @@ PORT=$((PORT+1))
N=$((N+1)) N=$((N+1))
TIOCEXCL="$($PROCAN -c |grep "^#define[[:space:]]*TIOCEXCL[[:space:]]" |cut -d' ' -f3)"
# test the generic ioctl-void option # test the generic ioctl-void option
NAME=IOCTL_VOID NAME=IOCTL_VOID
case "$TESTS" in case "$TESTS" in
@ -11291,10 +11289,6 @@ esac
N=$((N+1)) N=$((N+1))
SOL_SOCKET="$($PROCAN -c |grep "^#define[[:space:]]*SOL_SOCKET[[:space:]]" |cut -d' ' -f3)"
SO_REUSEADDR="$($PROCAN -c |grep "^#define[[:space:]]*SO_REUSEADDR[[:space:]]" |cut -d' ' -f3)"
TCP_MAXSEG="$($PROCAN -c |grep "^#define[[:space:]]*TCP_MAXSEG[[:space:]]" |cut -d' ' -f3)"
# Test the generic setsockopt option # Test the generic setsockopt option
NAME=SETSOCKOPT NAME=SETSOCKOPT
case "$TESTS" in case "$TESTS" in
@ -13860,8 +13854,7 @@ te="$td/test$N.stderr"
tdiff="$td/test$N.diff" tdiff="$td/test$N.diff"
dat="$td/test$N.dat" dat="$td/test$N.dat"
# calculate the minimal length with integer overflow # calculate the minimal length with integer overflow
BYTES=$($PROCAN |grep size_t |awk '{print($3);}') case $SIZE_T in
case $BYTES in
2) CHKSIZE=32768 ;; 2) CHKSIZE=32768 ;;
4) CHKSIZE=2147483648 ;; 4) CHKSIZE=2147483648 ;;
8) CHKSIZE=9223372036854775808 ;; 8) CHKSIZE=9223372036854775808 ;;
@ -15657,6 +15650,76 @@ esac
N=$((N+1)) N=$((N+1))
# Test preservation of packet boundaries from Socat to sub processes of
# various kind and back to Socat via socketpair with socket type datagram.
# (EXECSOCKETPAIRPACKETS SYSTEMSOCKETPAIRPACKETS)
for addr in exec system; do
ADDR=$(echo $addr |tr a-z A-Z)
NAME=${ADDR}SOCKETPAIRPACKETS
case "$TESTS" in
*%$N%*|*%functions%*|*%exec%*|*%socketpair%*|*%packets%*|*%$NAME%*)
TEST="$NAME: simple echo via $addr of cat with socketpair, keeping packet boundaries"
# Start a Socat process with a UNIX datagram socket on the left side and with
# a sub process connected via datagram socketpair that keeps packet boundaries
# (here: another Socat process in unidirectional mode).
# Pass two packets to the UNIX datagram socket; let Socat wait a little time
# before processing,
# so the packets are at the same time in the receive queue.
# The process that sends thes packet uses a short packet size (-b),
# so the returned data is truncated in case the packets were merged.
# When the complete data is returned, the test succeeded.
if ! eval $NUMCOND; then :; else
ts0="$td/test$N.sock0"
ts1="$td/test$N.sock1"
tf="$td/test$N.stdout"
te="$td/test$N.stderr"
tdiff="$td/test$N.diff"
da="test$N $(date) $RANDOM"
#CMD0="$TRACE $SOCAT $opts -lp server -T 2 UNIX-SENDTO:$ts1,bind=$ts0 $ADDR:\"$SOCAT -lp echoer -u - -\",pty,echo=0,pipes" # test the test
CMD0="$TRACE $SOCAT $opts -lp server -T 2 UNIX-SENDTO:$ts1,bind=$ts0 $ADDR:\"$SOCAT -lp echoer -u - -\",socktype=$SOCK_DGRAM"
CMD1="$SOCAT $opts -lp client -b 24 -t 2 -T 3 - UNIX-SENDTO:$ts0,bind=$ts1"
printf "test $F_n $TEST... " $N
export SOCAT_TRANSFER_WAIT=2
eval "$CMD0" >/dev/null 2>"${te}0" &
pid0="$!"
unset SOCAT_TRANSFER_WAIT
waitunixport $ts0 1
{ echo -n "${da:0:20}"; sleep 1; echo "${da:20}"; } |$CMD1 >"${tf}1" 2>"${te}1"
rc1=$?
kill $pid0 2>/dev/null; wait
if [ "$rc1" -ne 0 ]; then
$PRINTF "$FAILED (rc1=$rc1): $TRACE $SOCAT:\n"
echo "$CMD0 &"
cat "${te}0"
echo "{ echo -n "${da:0:20}"; sleep 1; echo "${da:20}"; } |$CMD1"
cat "${te}1"
numFAIL=$((numFAIL+1))
listFAIL="$listFAIL $N"
elif ! echo "$da" |diff - "${tf}1" >"$tdiff"; then
$PRINTF "$FAILED (diff)\n"
echo "$CMD0 &" >&2
cat "${te}0" >&2
echo "{ echo -n "${da:0:20}"; sleep 1; echo "${da:20}"; } |$CMD1" >&2
cat "${te}1" >&2
echo "diff:" >&2
cat $tdiff >&2
numFAIL=$((numFAIL+1))
listFAIL="$listFAIL $N"
else
$PRINTF "$OK\n"
if [ "$VERBOSE" ]; then
echo "$CMD0 &" >&2
echo "{ echo -n "${da:0:20}"; sleep 1; echo "${da:20}"; } |$CMD1" >&2
fi
numOK=$((numOK+1))
fi
fi # NUMCOND
;;
esac
N=$((N+1))
done # for
# end of common tests # end of common tests
################################################################################## ##################################################################################