connectivity: fix getnameinfo() call for musl libc
authorHauke Mehrtens <hauke@hauke-m.de>
Mon, 26 Oct 2015 21:42:40 +0000 (22:42 +0100)
committerJon A. Cruz <jonc@osg.samsung.com>
Tue, 24 Nov 2015 00:51:30 +0000 (00:51 +0000)
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>
Reviewed-on: https://gerrit.iotivity.org/gerrit/3959
Tested-by: jenkins-iotivity <jenkins-iotivity@opendaylight.org>
Reviewed-by: Jon A. Cruz <jonc@osg.samsung.com>
resource/csdk/connectivity/inc/caadapterutils.h
resource/csdk/connectivity/src/adapter_util/caadapternetdtls.c
resource/csdk/connectivity/src/adapter_util/caadapterutils.c
resource/csdk/connectivity/src/ip_adapter/caipserver.c
resource/csdk/connectivity/src/tcp_adapter/catcpserver.c

index 7c9611b..d146678 100644 (file)
@@ -212,13 +212,16 @@ void CAClearNetInterfaceInfoList(u_arraylist_t *infoList);
  */
 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 sockaddr_storage *sockaddr, char *host, ui
  * @param[out]  ipaddr    IP address info.
  */
 void CAConvertNameToAddr(const char *host, uint16_t port, struct sockaddr_storage *sockaddr);
+#endif /* WITH_ARDUINO */
 
 #ifdef __ANDROID__
 /**
index a0b5784..4687c6e 100644 (file)
@@ -417,7 +417,7 @@ static int32_t CAReadDecryptedPayload(dtls_context_t *context,
             ((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_context_t *context,
 
     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_context_t *context,
         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_context_t *ctx,
         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 dtls_context_t *ctx, const session_t *sess
     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]);
index 4d8e442..3022e99 100644 (file)
@@ -122,14 +122,15 @@ CAResult_t CAParseIPv4AddressInternal(const char *ipAddrStr, uint8_t *ipAddr,
  * 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 sockaddr_storage *sockAddr, char *host, ui
         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;
     }
index 2938c89..ef1508b 100644 (file)
@@ -304,7 +304,7 @@ static CAResult_t CAReceiveMessage(int fd, CATransportFlags_t flags)
         }
     }
 
-    CAConvertAddrToName(&srcAddr, sep.endpoint.addr, &sep.endpoint.port);
+    CAConvertAddrToName(&srcAddr, msg.msg_namelen, sep.endpoint.addr, &sep.endpoint.port);
 
     if (flags & CA_SECURE)
     {
index e51e11c..efbe6b1 100644 (file)
@@ -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);