summaryrefslogtreecommitdiff
path: root/erts/emulator
diff options
context:
space:
mode:
authorErlang/OTP <otp@erlang.org>2021-11-11 16:36:33 +0100
committerErlang/OTP <otp@erlang.org>2021-11-11 16:36:33 +0100
commit7b20a6c668ab6d34b07f8e765fbb26b742a056c6 (patch)
treeb75066f5396643e77d596d63115c2e3f165c97d8 /erts/emulator
parent9147fffe70ba3e112c6fb30e2c0389243b29cc1d (diff)
parentd28a16e03250aca693284f21107d6fd39f6da29a (diff)
downloaderlang-7b20a6c668ab6d34b07f8e765fbb26b742a056c6.tar.gz
Merge branch 'raimo/linux-dgram-reconnect/GH-5279/OTP-17736' into maint-24
* raimo/linux-dgram-reconnect/GH-5279/OTP-17736: Fix incorrect testcase skip Disconnect only if connected
Diffstat (limited to 'erts/emulator')
-rw-r--r--erts/emulator/drivers/common/inet_drv.c10
1 files changed, 7 insertions, 3 deletions
diff --git a/erts/emulator/drivers/common/inet_drv.c b/erts/emulator/drivers/common/inet_drv.c
index 46e73c8b83..00421d0c73 100644
--- a/erts/emulator/drivers/common/inet_drv.c
+++ b/erts/emulator/drivers/common/inet_drv.c
@@ -12635,15 +12635,19 @@ static ErlDrvSSizeT packet_inet_ctl(ErlDrvData e, unsigned int cmd, char* buf,
* change the source address when connecting
* a datagram socket to a new destination
*/
- sock_connect(desc->s, &disassoc_sa, disassoc_sa_size);
+ if (IS_CONNECTED(desc)) {
+ /* Dissolve association */
+ (void) sock_connect(desc->s, &disassoc_sa, disassoc_sa_size);
+ }
#endif /* #ifdef __linux__ */
code = sock_connect(desc->s,
(struct sockaddr*) &desc->remote, len);
if (IS_SOCKET_ERROR(code)) {
- sock_connect(desc->s, &disassoc_sa, disassoc_sa_size);
+ code = sock_errno(),
+ (void) sock_connect(desc->s, &disassoc_sa, disassoc_sa_size);
desc->state &= ~INET_F_ACTIVE;
- return ctl_error(sock_errno(), rbuf, rsize);
+ return ctl_error(code, rbuf, rsize);
}
else /* ok we are connected */ {
enq_async(desc, tbuf, INET_REQ_CONNECT);