IP-SENDTO:*:6 now passes getaddrinfo() without "ai_socktype not supported"

This commit is contained in:
Gerhard Rieger 2020-01-01 14:50:29 +01:00
parent cbeb06b19b
commit 3be18bdc1f
3 changed files with 44 additions and 13 deletions

View file

@ -9,6 +9,7 @@ Corrections:
applied to the second address, resulting in error applied to the second address, resulting in error
"Inappropriate ioctl for device" "Inappropriate ioctl for device"
This affected version 1.7.3.3 only. This affected version 1.7.3.3 only.
Test: TERMIOS_PH_ALL
Thanks to Ivan J. for reporting this issue. Thanks to Ivan J. for reporting this issue.
Socat failed to compile when no poll() system call was found by Socat failed to compile when no poll() system call was found by
@ -19,6 +20,12 @@ Corrections:
systems with, e.g., OpenSSL-0.9.8. Thanks to Simon Matter and Moritz B. systems with, e.g., OpenSSL-0.9.8. Thanks to Simon Matter and Moritz B.
for reporting this problem and sending initial patches. for reporting this problem and sending initial patches.
getaddrinfo() in IP4-SENDTO and IP6-SENDTO addresses failed with
"ai_socktype not supported" when protocol 6 was addressed.
The fix removes the possibility to use service names with SCTP.
Test: IP_SENDTO_6
Thanks to Sören for sending an initial patch.
####################### V 1.7.3.3: ####################### V 1.7.3.3:
Corrections: Corrections:

33
test.sh
View file

@ -13061,6 +13061,39 @@ PORT=$((PORT+1))
N=$((N+1)) N=$((N+1))
# Due to a fallback logic before calling getaddrinfo(), intended to allow use
# of service (port) names with SCTP, raw socket addresses where resolved with
# socket type stream, which fails for protocol 6 (TCP)
# Fixed after 1.7.3.3
NAME=IP_SENDTO_6
case "$TESTS" in
*%$N%*|*%functions%*|*%bugs%*|*%socket%*|*%rawip%*|*%rawip4%*|*%$NAME%*)
TEST="$NAME: IP-SENDTO::6 passes getaddrinfo()"
# invoke socat with address IP-SENDTO:*:6; when this does not fail with
# "ai_socktype not supported", the test succeeded
if ! eval $NUMCOND; then :; else
tf="$td/test$N.stdout"
te="$td/test$N.stderr"
tdiff="$td/test$N.diff"
CMD0="$TRACE $SOCAT $opts -u /dev/null IP-SENDTO:127.0.0.1:6"
printf "test $F_n $TEST... " $N
$CMD0 >/dev/null 2>"${te}0"
if ! grep -q "ai_socktype not supported" ${te}0; then
$PRINTF "$OK\n"
numOK=$((numOK+1))
else
$PRINTF "$FAILED\n"
echo "$CMD0"
cat "${te}0"
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

View file

@ -121,7 +121,7 @@ unsigned long res_opts() {
hostname.domain (fq hostname resolving to IPv4 or IPv6 address) hostname.domain (fq hostname resolving to IPv4 or IPv6 address)
service: the port specification; may be numeric or symbolic service: the port specification; may be numeric or symbolic
family: PF_INET, PF_INET6, or PF_UNSPEC permitting both family: PF_INET, PF_INET6, or PF_UNSPEC permitting both
socktype: SOCK_STREAM, SOCK_DGRAM socktype: SOCK_STREAM, SOCK_DGRAM, ...
protocol: IPPROTO_UDP, IPPROTO_TCP protocol: IPPROTO_UDP, IPPROTO_TCP
sau: an uninitialized storage for the resulting socket address sau: an uninitialized storage for the resulting socket address
returns: STAT_OK, STAT_RETRYLATER returns: STAT_OK, STAT_RETRYLATER
@ -202,18 +202,9 @@ int xiogetaddrinfo(const char *node, const char *service,
if (node != NULL || service != NULL) { if (node != NULL || service != NULL) {
struct addrinfo *record; struct addrinfo *record;
if (socktype != SOCK_STREAM && socktype != SOCK_DGRAM) { /* here was code that helped SCTP to use service names.
/* actual socket type value is not supported - fallback to a good one */ If you need this feature enhance your /etc/services with sctp entries */
socktype = SOCK_DGRAM;
}
if (protocol != IPPROTO_TCP && protocol != IPPROTO_UDP) {
/* actual protocol value is not supported - fallback to a good one */
if (socktype == SOCK_DGRAM) {
protocol = IPPROTO_UDP;
} else {
protocol = IPPROTO_TCP;
}
}
hints.ai_flags |= AI_PASSIVE; hints.ai_flags |= AI_PASSIVE;
hints.ai_family = family; hints.ai_family = family;
hints.ai_socktype = socktype; hints.ai_socktype = socktype;