gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[gnunet] branch master updated: fix #8046


From: gnunet
Subject: [gnunet] branch master updated: fix #8046
Date: Tue, 09 Jan 2024 19:09:28 +0100

This is an automated email from the git hooks/post-receive script.

grothoff pushed a commit to branch master
in repository gnunet.

The following commit(s) were added to refs/heads/master by this push:
     new 86323ede5 fix #8046
86323ede5 is described below

commit 86323ede5601f5ae0e1a3a8d097406bcc64f4dfc
Author: Christian Grothoff <christian@grothoff.org>
AuthorDate: Tue Jan 9 19:08:28 2024 +0100

    fix #8046
---
 src/include/gnunet_strings_lib.h |   4 +-
 src/lib/util/strings.c           | 111 +++++++++++++++++++++------------------
 2 files changed, 61 insertions(+), 54 deletions(-)

diff --git a/src/include/gnunet_strings_lib.h b/src/include/gnunet_strings_lib.h
index be41fb1d9..f5aaf7014 100644
--- a/src/include/gnunet_strings_lib.h
+++ b/src/include/gnunet_strings_lib.h
@@ -578,7 +578,7 @@ GNUNET_STRINGS_check_filename (const char *filename,
  */
 enum GNUNET_GenericReturnValue
 GNUNET_STRINGS_to_address_ipv6 (const char *zt_addr,
-                                uint16_t addrlen,
+                                size_t addrlen,
                                 struct sockaddr_in6 *r_buf);
 
 
@@ -594,7 +594,7 @@ GNUNET_STRINGS_to_address_ipv6 (const char *zt_addr,
  */
 enum GNUNET_GenericReturnValue
 GNUNET_STRINGS_to_address_ipv4 (const char *zt_addr,
-                                uint16_t addrlen,
+                                size_t addrlen,
                                 struct sockaddr_in *r_buf);
 
 
diff --git a/src/lib/util/strings.c b/src/lib/util/strings.c
index 4f729771c..493d20f1e 100644
--- a/src/lib/util/strings.c
+++ b/src/lib/util/strings.c
@@ -1031,70 +1031,77 @@ GNUNET_STRINGS_check_filename (const char *filename,
 
 enum GNUNET_GenericReturnValue
 GNUNET_STRINGS_to_address_ipv6 (const char *zt_addr,
-                                uint16_t addrlen,
+                                size_t addrlen,
                                 struct sockaddr_in6 *r_buf)
 {
-  char zbuf[addrlen + 1];
-  int ret;
-  char *port_colon;
-  unsigned int port;
-  char dummy[2];
-
   if (addrlen < 6)
     return GNUNET_SYSERR;
-  GNUNET_memcpy (zbuf, zt_addr, addrlen);
-  if ('[' != zbuf[0])
-  {
-    GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
-                _ ("IPv6 address did not start with `['\n"));
-    return GNUNET_SYSERR;
-  }
-  zbuf[addrlen] = '\0';
-  port_colon = strrchr (zbuf, ':');
-  if (NULL == port_colon)
-  {
-    GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
-                _ ("IPv6 address did contain ':' to separate port number\n"));
-    return GNUNET_SYSERR;
-  }
-  if (']' != *(port_colon - 1))
+  if (addrlen > 512)
+    return GNUNET_SYSERR; /* sanity check to protect zbuf allocation,
+                             actual limit is not precise */
   {
-    GNUNET_log (
-      GNUNET_ERROR_TYPE_WARNING,
-      _ ("IPv6 address did contain ']' before ':' to separate port number\n"));
-    return GNUNET_SYSERR;
-  }
-  ret = sscanf (port_colon, ":%u%1s", &port, dummy);
-  if ((1 != ret) || (port > 65535))
-  {
-    GNUNET_log (
-      GNUNET_ERROR_TYPE_WARNING,
-      _ ("IPv6 address did contain a valid port number after the last ':'\n"));
-    return GNUNET_SYSERR;
-  }
-  *(port_colon - 1) = '\0';
-  memset (r_buf, 0, sizeof(struct sockaddr_in6));
-  ret = inet_pton (AF_INET6, &zbuf[1], &r_buf->sin6_addr);
-  if (ret <= 0)
-  {
-    GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
-                _ ("Invalid IPv6 address `%s': %s\n"),
-                &zbuf[1],
-                strerror (errno));
-    return GNUNET_SYSERR;
-  }
-  r_buf->sin6_port = htons (port);
-  r_buf->sin6_family = AF_INET6;
+    char zbuf[addrlen + 1];
+    int ret;
+    char *port_colon;
+    unsigned int port;
+    char dummy[2];
+
+    GNUNET_memcpy (zbuf, zt_addr, addrlen);
+    if ('[' != zbuf[0])
+    {
+      GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
+                  _ ("IPv6 address did not start with `['\n"));
+      return GNUNET_SYSERR;
+    }
+    zbuf[addrlen] = '\0';
+    port_colon = strrchr (zbuf, ':');
+    if (NULL == port_colon)
+    {
+      GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
+                  _ ("IPv6 address did contain ':' to separate port 
number\n"));
+      return GNUNET_SYSERR;
+    }
+    if (']' != *(port_colon - 1))
+    {
+      GNUNET_log (
+        GNUNET_ERROR_TYPE_WARNING,
+        _ (
+          "IPv6 address did contain ']' before ':' to separate port 
number\n"));
+      return GNUNET_SYSERR;
+    }
+    ret = sscanf (port_colon, ":%u%1s", &port, dummy);
+    if ((1 != ret) || (port > 65535))
+    {
+      GNUNET_log (
+        GNUNET_ERROR_TYPE_WARNING,
+        _ (
+          "IPv6 address did contain a valid port number after the last 
':'\n"));
+      return GNUNET_SYSERR;
+    }
+    *(port_colon - 1) = '\0';
+    memset (r_buf, 0, sizeof(struct sockaddr_in6));
+    ret = inet_pton (AF_INET6, &zbuf[1], &r_buf->sin6_addr);
+    if (ret <= 0)
+    {
+      GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
+                  _ ("Invalid IPv6 address `%s': %s\n"),
+                  &zbuf[1],
+                  strerror (errno));
+      return GNUNET_SYSERR;
+    }
+    r_buf->sin6_port = htons (port);
+    r_buf->sin6_family = AF_INET6;
 #if HAVE_SOCKADDR_IN_SIN_LEN
-  r_buf->sin6_len = (u_char) sizeof(struct sockaddr_in6);
+    r_buf->sin6_len = (u_char) sizeof(struct sockaddr_in6);
 #endif
-  return GNUNET_OK;
+    return GNUNET_OK;
+  }
 }
 
 
 enum GNUNET_GenericReturnValue
 GNUNET_STRINGS_to_address_ipv4 (const char *zt_addr,
-                                uint16_t addrlen,
+                                size_t addrlen,
                                 struct sockaddr_in *r_buf)
 {
   unsigned int temps[4];

-- 
To stop receiving notification emails like this one, please contact
gnunet@gnunet.org.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]