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