packages/net/iotivity/patches/012-connectivity-fix-getnameinfo-call-for-musl-libc.patch
Hauke Mehrtens f5e06e1205 iotivity: update to version 1.0.0
This brings IoTivity to version 1.0.0. The patches removed by this
commit are merged upstream now. There are some new patches needed for
new problems with Big Endian CPUs and also for musl. The plugin manager
was removed in upstream IoTivity 1.0.0.

Signed-off-by: Hauke Mehrtens <hauke.mehrtens@lantiq.com>
2015-10-27 19:09:24 +01:00

161 lines
7.4 KiB
Diff

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);