Skip to content

Commit 20094df

Browse files
address issues causing network connectivity failures on macOS (#4473)
1 parent 0f168ec commit 20094df

File tree

5 files changed

+43
-11
lines changed

5 files changed

+43
-11
lines changed

code/inetfile/cftp.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -372,7 +372,7 @@ bool CFtpGet::IssuePasv()
372372
return false;
373373
}
374374

375-
if ( connect(m_DataSock, reinterpret_cast<LPSOCKADDR>(&dataaddr), sizeof(dataaddr)) == SOCKET_ERROR ) {
375+
if ( connect(m_DataSock, reinterpret_cast<LPSOCKADDR>(&dataaddr), psnet_get_sockaddr_len(&dataaddr)) == SOCKET_ERROR ) {
376376
return false;
377377
}
378378

@@ -392,7 +392,7 @@ int CFtpGet::ConnectControlSocket()
392392
}
393393

394394
// Now we will connect to the host
395-
if ( connect(m_ControlSock, reinterpret_cast<LPSOCKADDR>(&m_ServerAddr), sizeof(m_ServerAddr)) ) {
395+
if ( connect(m_ControlSock, reinterpret_cast<LPSOCKADDR>(&m_ServerAddr), psnet_get_sockaddr_len(&m_ServerAddr)) ) {
396396
m_State = FTP_STATE_CANT_CONNECT;
397397
return 0;
398398
}

code/inetfile/chttpget.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -331,7 +331,7 @@ int ChttpGet::ConnectSocket()
331331
timeout.tv_sec = 0;
332332
timeout.tv_usec = 0;
333333

334-
int serr = connect(m_DataSock, reinterpret_cast<LPSOCKADDR>(&hostaddr), sizeof(hostaddr));
334+
int serr = connect(m_DataSock, reinterpret_cast<LPSOCKADDR>(&hostaddr), psnet_get_sockaddr_len(&hostaddr));
335335
int cerr = WSAGetLastError();
336336
if (serr) {
337337
// fail after 20 seconds
@@ -360,7 +360,7 @@ int ChttpGet::ConnectSocket()
360360
if (m_Aborting)
361361
return 0;
362362

363-
serr = connect(m_DataSock, reinterpret_cast<LPSOCKADDR>(&hostaddr), sizeof(hostaddr));
363+
serr = connect(m_DataSock, reinterpret_cast<LPSOCKADDR>(&hostaddr), psnet_get_sockaddr_len(&hostaddr));
364364

365365
if (serr == 0)
366366
break;

code/network/chat_api.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,7 @@ int ConnectToChatServer(char *serveraddr, char *nickname, char *trackerid)
152152
return -1;
153153
}
154154

155-
if (SOCKET_ERROR==bind(Chatsock, reinterpret_cast<LPSOCKADDR>(&Chataddr), sizeof(Chataddr)))
155+
if (SOCKET_ERROR==bind(Chatsock, reinterpret_cast<LPSOCKADDR>(&Chataddr), psnet_get_sockaddr_len(&Chataddr)))
156156
{
157157
return -1;
158158
}
@@ -164,7 +164,7 @@ int ConnectToChatServer(char *serveraddr, char *nickname, char *trackerid)
164164
return -2;
165165
}
166166

167-
if(SOCKET_ERROR == connect(Chatsock, reinterpret_cast<LPSOCKADDR>(&Chataddr), sizeof(Chataddr)))
167+
if(SOCKET_ERROR == connect(Chatsock, reinterpret_cast<LPSOCKADDR>(&Chataddr), psnet_get_sockaddr_len(&Chataddr)))
168168
{
169169
if(WSAEWOULDBLOCK == WSAGetLastError())
170170
{

code/network/psnet2.cpp

Lines changed: 34 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -332,8 +332,14 @@ int SENDTO(SOCKET s, char * buf, int len, int flags, SOCKADDR *to, int tolen, in
332332
outbuf[0] = static_cast<char>(psnet_type);
333333
memcpy(&outbuf[1], buf, static_cast<size_t>(len));
334334

335+
SOCKLEN_T addrlen = tolen;
336+
337+
if (addrlen == sizeof(SOCKADDR_STORAGE)) {
338+
addrlen = psnet_get_sockaddr_len(reinterpret_cast<SOCKADDR_STORAGE*>(to));
339+
}
340+
335341
// send it
336-
return static_cast<int>( sendto(s, outbuf, len + 1, flags, reinterpret_cast<LPSOCKADDR>(to), tolen) );
342+
return static_cast<int>( sendto(s, outbuf, len + 1, flags, reinterpret_cast<LPSOCKADDR>(to), addrlen) );
337343
}
338344

339345
/**
@@ -547,7 +553,7 @@ bool psnet_init_my_addr()
547553
continue;
548554
}
549555

550-
rval = connect(tsock, reinterpret_cast<LPSOCKADDR>(&remote_addr), sizeof(remote_addr));
556+
rval = connect(tsock, reinterpret_cast<LPSOCKADDR>(&remote_addr), psnet_get_sockaddr_len(&remote_addr));
551557

552558
if (rval) {
553559
continue;
@@ -586,7 +592,7 @@ bool psnet_init_my_addr()
586592
continue;
587593
}
588594

589-
rval = connect(tsock, reinterpret_cast<LPSOCKADDR>(&remote_addr), sizeof(remote_addr));
595+
rval = connect(tsock, reinterpret_cast<LPSOCKADDR>(&remote_addr), psnet_get_sockaddr_len(&remote_addr));
590596

591597
if (rval) {
592598
continue;
@@ -919,6 +925,25 @@ static void psnet_sockaddr_storage_to_in6(const SOCKADDR_STORAGE *addr, SOCKADDR
919925
}
920926
}
921927

928+
/**
929+
* @brief Helper to get the exact length of a specific protocol struct from
930+
* a generic storage struct
931+
*
932+
* @param addr
933+
* @return SOCKLEN_T
934+
*/
935+
SOCKLEN_T psnet_get_sockaddr_len(const SOCKADDR_STORAGE *addr)
936+
{
937+
// internally we should always use IPv6, but cover the bases
938+
if (addr->ss_family == AF_INET6) {
939+
return static_cast<SOCKLEN_T>(sizeof(SOCKADDR_IN6));
940+
} else if (addr->ss_family == AF_INET) {
941+
return static_cast<SOCKLEN_T>(sizeof(SOCKADDR_IN));
942+
} else {
943+
return static_cast<SOCKLEN_T>(sizeof(SOCKADDR_STORAGE));
944+
}
945+
}
946+
922947
/**
923948
* Helper to map IPv4 to IPv6
924949
*/
@@ -1126,6 +1151,7 @@ bool psnet_get_addr(const char *host, const char *port, SOCKADDR_STORAGE *addr,
11261151
SOCKADDR_IN6 si4to6;
11271152
int rval;
11281153

1154+
memset(addr, 0, sizeof(*addr));
11291155
memset(&si4to6, 0, sizeof(si4to6));
11301156

11311157
memset(&hints, 0, sizeof(hints));
@@ -2317,9 +2343,12 @@ bool psnet_init_socket()
23172343
psnet_set_socket_options();
23182344

23192345
// bind the socket
2320-
psnet_get_addr(nullptr, Psnet_default_port, &sockaddr);
2346+
if ( !psnet_get_addr(nullptr, Psnet_default_port, &sockaddr) ) {
2347+
ml_printf("Failed to get bind addr!");
2348+
return false;
2349+
}
23212350

2322-
if ( bind(Psnet_socket, reinterpret_cast<LPSOCKADDR>(&sockaddr), sizeof(sockaddr)) == SOCKET_ERROR) {
2351+
if ( bind(Psnet_socket, reinterpret_cast<LPSOCKADDR>(&sockaddr), psnet_get_sockaddr_len(&sockaddr)) == SOCKET_ERROR) {
23232352
Psnet_failure_code = WSAGetLastError();
23242353

23252354
if (Psnet_failure_code == WSAEADDRINUSE) {

code/network/psnet2.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,9 @@ bool psnet_get_addr(const char *host, uint16_t port, SOCKADDR_STORAGE *addr, int
178178
#define ADDR_FLAG_NUMERIC_SERVICE (1<<0)
179179
#define ADDR_FLAG_PREFER_IPV4 (1<<1)
180180

181+
// get protocol struct length from generic storage struct
182+
SOCKLEN_T psnet_get_sockaddr_len(const SOCKADDR_STORAGE *addr);
183+
181184
// map an IPv4 address to IPv6
182185
void psnet_map4to6(const in_addr *in4, in6_addr *in6);
183186

0 commit comments

Comments
 (0)