Make inet_pton failures non-fatal
parent
e8c55465d8
commit
818a4ea631
16
socketft.cpp
16
socketft.cpp
|
|
@ -5,7 +5,6 @@
|
||||||
|
|
||||||
#if !defined(NO_OS_DEPENDENCE) && defined(SOCKETS_AVAILABLE)
|
#if !defined(NO_OS_DEPENDENCE) && defined(SOCKETS_AVAILABLE)
|
||||||
|
|
||||||
// TODO: http://github.com/weidai11/cryptopp/issues/19
|
|
||||||
#include "socketft.h"
|
#include "socketft.h"
|
||||||
#include "wait.h"
|
#include "wait.h"
|
||||||
|
|
||||||
|
|
@ -65,6 +64,9 @@ int inet_pton(int af, const char *src, void *dst)
|
||||||
# pragma warning(disable: 4996)
|
# pragma warning(disable: 4996)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// Posix states only src is validated. Avoid a bad dst dereference.
|
||||||
|
if(!src || !dst) return 0;
|
||||||
|
|
||||||
struct sockaddr_storage ss;
|
struct sockaddr_storage ss;
|
||||||
int size = sizeof(ss);
|
int size = sizeof(ss);
|
||||||
|
|
||||||
|
|
@ -79,6 +81,8 @@ int inet_pton(int af, const char *src, void *dst)
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
((sockaddr_in *)dst)->sin_addr.s_addr = INADDR_NONE;
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
#if CRYPTOPP_MSC_VERSION
|
#if CRYPTOPP_MSC_VERSION
|
||||||
|
|
@ -205,17 +209,15 @@ bool Socket::Connect(const char *addr, unsigned int port)
|
||||||
memset(&sa, 0, sizeof(sa));
|
memset(&sa, 0, sizeof(sa));
|
||||||
sa.sin_family = AF_INET;
|
sa.sin_family = AF_INET;
|
||||||
|
|
||||||
if (inet_pton(AF_INET, addr, &sa.sin_addr.s_addr) < 1 || sa.sin_addr.s_addr == INADDR_NONE)
|
// Make inet_pton failures non-fatal.
|
||||||
{
|
if (!addr || inet_pton(AF_INET, addr, &sa.sin_addr.s_addr) < 1)
|
||||||
SetLastError(SOCKET_EINVAL);
|
sa.sin_addr.s_addr = INADDR_NONE;
|
||||||
CheckAndHandleError_int("inet_pton", SOCKET_ERROR);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (sa.sin_addr.s_addr == INADDR_NONE)
|
if (sa.sin_addr.s_addr == INADDR_NONE)
|
||||||
{
|
{
|
||||||
addrinfo hints, *result = NULL;
|
addrinfo hints, *result = NULL;
|
||||||
|
|
||||||
memset(&hints, 0, sizeof(hints));
|
memset(&hints, 0, sizeof(hints));
|
||||||
|
|
||||||
hints.ai_socktype = SOCK_STREAM;
|
hints.ai_socktype = SOCK_STREAM;
|
||||||
hints.ai_family = AF_INET;
|
hints.ai_family = AF_INET;
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue