You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nuttx.apache.org by xi...@apache.org on 2020/05/15 06:23:59 UTC

[incubator-nuttx] 02/03: netdb: Truncate the list of ips instead of bailing out with ERANGE

This is an automated email from the ASF dual-hosted git repository.

xiaoxiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-nuttx.git

commit e783a59f9da062b86fd3c51e11dd350b7e4a4c04
Author: YAMAMOTO Takashi <ya...@midokura.com>
AuthorDate: Fri May 15 13:43:34 2020 +0900

    netdb: Truncate the list of ips instead of bailing out with ERANGE
    
    In many cases, users only care the first address anyway.
---
 libs/libc/netdb/lib_gethostentbynamer.c | 23 ++++++++---------------
 1 file changed, 8 insertions(+), 15 deletions(-)

diff --git a/libs/libc/netdb/lib_gethostentbynamer.c b/libs/libc/netdb/lib_gethostentbynamer.c
index 8c21930..9eec05d 100644
--- a/libs/libc/netdb/lib_gethostentbynamer.c
+++ b/libs/libc/netdb/lib_gethostentbynamer.c
@@ -487,9 +487,12 @@ static int lib_dns_lookup(FAR const char *name, FAR struct hostent_s *host,
 
   /* Verify that we have a buffer big enough to get started (it still may not
    * be big enough).
+   * Verify that there is space for at least one address.
    */
 
-  if (buflen <= sizeof(struct hostent_info_s))
+  namelen = strlen(name);
+  if (buflen < sizeof(struct hostent_info_s) - 1 + sizeof(union dns_addr_u) +
+      namelen + 1)
     {
       return -ERANGE;
     }
@@ -500,13 +503,6 @@ static int lib_dns_lookup(FAR const char *name, FAR struct hostent_s *host,
   ptr     = info->hi_data;
   buflen -= (sizeof(struct hostent_info_s) - 1);
 
-  /* Verify again that there is space for at least one address. */
-
-  if (buflen < sizeof(union dns_addr_u))
-    {
-      return -ERANGE;
-    }
-
   memset(host, 0, sizeof(struct hostent_s));
   memset(info, 0, sizeof(struct hostent_info_s));
 
@@ -516,7 +512,8 @@ static int lib_dns_lookup(FAR const char *name, FAR struct hostent_s *host,
 
   /* Try to get the host address using the DNS name server */
 
-  naddr = buflen / sizeof(union dns_addr_u);
+  naddr = (buflen - (namelen + 1)) / sizeof(union dns_addr_u);
+  DEBUGASSERT(naddr >= 1);
   ret = lib_dns_query(name, (FAR union dns_addr_u *)ptr, &naddr);
   if (ret < 0)
     {
@@ -555,18 +552,14 @@ static int lib_dns_lookup(FAR const char *name, FAR struct hostent_s *host,
       info->hi_lengths[i]   = addrlen;
       info->hi_addrlist[i]  = addrdata;
 
+      DEBUGASSERT(buflen >= namelen + 1 + sizeof(union dns_addr_u));
       ptr    += sizeof(union dns_addr_u);
       buflen -= sizeof(union dns_addr_u);
     }
 
   /* And copy name */
 
-  namelen = strlen(name);
-  if ((namelen + 1) > buflen)
-    {
-      return -ERANGE;
-    }
-
+  DEBUGASSERT(buflen >= namelen + 1);
   strncpy(ptr, name, buflen);
 
   /* Set the address to h_name */