You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

161 lines
7.4 KiB

From 75a19e9059e671442abe40908ba80c2da614118d Mon Sep 17 00:00:00 2001
From: Hauke Mehrtens <hauke@hauke-m.de>
Date: Mon, 26 Oct 2015 22:42:40 +0100
Subject: [PATCH] connectivity: fix getnameinfo() call for musl libc
The musl libc and also the libc from net/freebsd are currently checking
if the size of the sockaddr given to getnameinfo() matches the size for
this family and it fails when giving sizeof(struct sockaddr_storage).
This patch fixes this problem by making the caller also provide the
size of the struct sockaddr_storage.
I am currently trying to get a fix for this problem into musl libc, but
IoTivity should still fix this.
This also fixes a wrong error message.
Change-Id: Ie9b89523b5ba20e536c03e3ad85c65bd5ff2ba53
Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
---
resource/csdk/connectivity/inc/caadapterutils.h | 12 ++++++++----
.../csdk/connectivity/src/adapter_util/caadapternetdtls.c | 10 +++++-----
resource/csdk/connectivity/src/adapter_util/caadapterutils.c | 9 +++++----
resource/csdk/connectivity/src/ip_adapter/caipserver.c | 2 +-
resource/csdk/connectivity/src/tcp_adapter/catcpserver.c | 2 +-
5 files changed, 20 insertions(+), 15 deletions(-)
--- a/resource/csdk/connectivity/inc/caadapterutils.h
+++ b/resource/csdk/connectivity/inc/caadapterutils.h
@@ -212,13 +212,16 @@ void CAClearNetInterfaceInfoList(u_array
*/
void CAClearServerInfoList(u_arraylist_t *serverInfoList);
+#ifndef WITH_ARDUINO
/**
* Convert address from binary to string.
- * @param[in] ipaddr IP address info.
- * @param[out] host address string (must be CA_IPADDR_SIZE).
- * @param[out] port host order port number.
+ * @param[in] sockAddr IP address info.
+ * @param[in] sockAddrLen size of sockAddr.
+ * @param[out] host address string (must be CA_IPADDR_SIZE).
+ * @param[out] port host order port number.
*/
-void CAConvertAddrToName(const struct sockaddr_storage *sockaddr, char *host, uint16_t *port);
+void CAConvertAddrToName(const struct sockaddr_storage *sockAddr, socklen_t sockAddrLen,
+ char *host, uint16_t *port);
/**
* Convert address from string to binary.
@@ -227,6 +230,7 @@ void CAConvertAddrToName(const struct so
* @param[out] ipaddr IP address info.
*/
void CAConvertNameToAddr(const char *host, uint16_t port, struct sockaddr_storage *sockaddr);
+#endif /* WITH_ARDUINO */
#ifdef __ANDROID__
/**
--- a/resource/csdk/connectivity/src/adapter_util/caadapternetdtls.c
+++ b/resource/csdk/connectivity/src/adapter_util/caadapternetdtls.c
@@ -417,7 +417,7 @@ static int32_t CAReadDecryptedPayload(dt
((addrInfo->addr.st.ss_family == AF_INET) ? CA_IPV4 : CA_IPV6) | CA_SECURE, .port = 0 },
.identity =
{ 0 } };
- CAConvertAddrToName(&(addrInfo->addr.st), sep.endpoint.addr, &sep.endpoint.port);
+ CAConvertAddrToName(&(addrInfo->addr.st), addrInfo->size, sep.endpoint.addr, &sep.endpoint.port);
if (NULL == g_caDtlsContext)
{
@@ -468,7 +468,7 @@ static int32_t CASendSecureData(dtls_con
CAEndpoint_t endpoint = {.adapter = CA_DEFAULT_ADAPTER};
- CAConvertAddrToName(&(addrInfo->addr.st), endpoint.addr, &endpoint.port);
+ CAConvertAddrToName(&(addrInfo->addr.st), addrInfo->size, endpoint.addr, &endpoint.port);
endpoint.flags = addrInfo->addr.st.ss_family == AF_INET ? CA_IPV4 : CA_IPV6;
endpoint.flags |= CA_SECURE;
endpoint.adapter = CA_ADAPTER_IP;
@@ -515,7 +515,7 @@ static int32_t CAHandleSecureEvent(dtls_
stCADtlsAddrInfo_t *addrInfo = (stCADtlsAddrInfo_t *)session;
char peerAddr[MAX_ADDR_STR_SIZE_CA] = { 0 };
uint16_t port = 0;
- CAConvertAddrToName(&(addrInfo->addr.st), peerAddr, &port);
+ CAConvertAddrToName(&(addrInfo->addr.st), addrInfo->size, peerAddr, &port);
CARemovePeerFromPeerInfoList(peerAddr, port);
}
@@ -553,7 +553,7 @@ static int32_t CAGetPskCredentials(dtls_
stCADtlsAddrInfo_t *addrInfo = (stCADtlsAddrInfo_t *)session;
char peerAddr[MAX_ADDR_STR_SIZE_CA] = { 0 };
uint16_t port = 0;
- CAConvertAddrToName(&(addrInfo->addr.st), peerAddr, &port);
+ CAConvertAddrToName(&(addrInfo->addr.st), addrInfo->size, peerAddr, &port);
if(CA_STATUS_OK != CAAddIdToPeerInfoList(peerAddr, port, desc, descLen) )
{
@@ -933,7 +933,7 @@ static int CAVerifyCertificate(struct dt
stCADtlsAddrInfo_t *addrInfo = (stCADtlsAddrInfo_t *)session;
char peerAddr[MAX_ADDR_STR_SIZE_CA] = { 0 };
uint16_t port = 0;
- CAConvertAddrToName(&(addrInfo->addr.st), peerAddr, &port);
+ CAConvertAddrToName(&(addrInfo->addr.st), addrInfo->size, peerAddr, &port);
CAResult_t result = CAAddIdToPeerInfoList(peerAddr, port,
crtChain[0].subject.data + DER_SUBJECT_HEADER_LEN + 2, crtChain[0].subject.data[DER_SUBJECT_HEADER_LEN + 1]);
--- a/resource/csdk/connectivity/src/adapter_util/caadapterutils.c
+++ b/resource/csdk/connectivity/src/adapter_util/caadapterutils.c
@@ -122,14 +122,15 @@ CAResult_t CAParseIPv4AddressInternal(co
* These two conversion functions return void because errors can't happen
* (because of NI_NUMERIC), and there's nothing to do if they do happen.
*/
-void CAConvertAddrToName(const struct sockaddr_storage *sockAddr, char *host, uint16_t *port)
+void CAConvertAddrToName(const struct sockaddr_storage *sockAddr, socklen_t sockAddrLen,
+ char *host, uint16_t *port)
{
VERIFY_NON_NULL_VOID(sockAddr, CA_ADAPTER_UTILS_TAG, "sockAddr is null");
VERIFY_NON_NULL_VOID(host, CA_ADAPTER_UTILS_TAG, "host is null");
VERIFY_NON_NULL_VOID(port, CA_ADAPTER_UTILS_TAG, "port is null");
int r = getnameinfo((struct sockaddr *)sockAddr,
- sizeof (struct sockaddr_storage),
+ sockAddrLen,
host, MAX_ADDR_STR_SIZE_CA,
NULL, 0,
NI_NUMERICHOST|NI_NUMERICSERV);
@@ -138,12 +139,12 @@ void CAConvertAddrToName(const struct so
if (EAI_SYSTEM == r)
{
OIC_LOG_V(ERROR, CA_ADAPTER_UTILS_TAG,
- "getaddrinfo failed: errno %s", strerror(errno));
+ "getnameinfo failed: errno %s", strerror(errno));
}
else
{
OIC_LOG_V(ERROR, CA_ADAPTER_UTILS_TAG,
- "getaddrinfo failed: %s", gai_strerror(r));
+ "getnameinfo failed: %s", gai_strerror(r));
}
return;
}
--- a/resource/csdk/connectivity/src/ip_adapter/caipserver.c
+++ b/resource/csdk/connectivity/src/ip_adapter/caipserver.c
@@ -299,7 +299,7 @@ static CAResult_t CAReceiveMessage(int f
}
}
- CAConvertAddrToName(&srcAddr, sep.endpoint.addr, &sep.endpoint.port);
+ CAConvertAddrToName(&srcAddr, msg.msg_namelen, sep.endpoint.addr, &sep.endpoint.port);
if (flags & CA_SECURE)
{
--- a/resource/csdk/connectivity/src/tcp_adapter/catcpserver.c
+++ b/resource/csdk/connectivity/src/tcp_adapter/catcpserver.c
@@ -478,7 +478,7 @@ static void CAAcceptHandler(void *data)
}
svritem->u4tcp.fd = sockfd;
- CAConvertAddrToName((struct sockaddr_storage *)&clientaddr,
+ CAConvertAddrToName((struct sockaddr_storage *)&clientaddr, clientlen,
(char *) &svritem->addr, &svritem->u4tcp.port);
ca_mutex_lock(g_mutexObjectList);