tolerate additional IPv4 address now available for gnunet.org
[oweals/gnunet.git] / src / util / strings.c
index e3bdadd39be4756d198db599a8bfa68c2f9ed920..2cbdb640b6fd8abc1ad3e30f2f008df387cceac2 100644 (file)
@@ -14,6 +14,8 @@
 
      You should have received a copy of the GNU Affero General Public License
      along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+     SPDX-License-Identifier: AGPL3.0-or-later
 */
 /**
  * @file util/strings.c
@@ -383,6 +385,7 @@ GNUNET_STRINGS_fancy_time_to_absolute (const char *fancy_time,
 {
   struct tm tv;
   time_t t;
+  const char *eos;
 
   if (0 == strcasecmp ("end of time",
                        fancy_time))
@@ -390,17 +393,18 @@ GNUNET_STRINGS_fancy_time_to_absolute (const char *fancy_time,
     *atime = GNUNET_TIME_UNIT_FOREVER_ABS;
     return GNUNET_OK;
   }
+  eos = &fancy_time[strlen (fancy_time)];
   memset (&tv, 0, sizeof (tv));
-  if ( (NULL == strptime (fancy_time, "%a %b %d %H:%M:%S %Y", &tv)) &&
-       (NULL == strptime (fancy_time, "%c", &tv)) &&
-       (NULL == strptime (fancy_time, "%Ec", &tv)) &&
-       (NULL == strptime (fancy_time, "%Y-%m-%d %H:%M:%S", &tv)) &&
-       (NULL == strptime (fancy_time, "%Y-%m-%d %H:%M", &tv)) &&
-       (NULL == strptime (fancy_time, "%x", &tv)) &&
-       (NULL == strptime (fancy_time, "%Ex", &tv)) &&
-       (NULL == strptime (fancy_time, "%Y-%m-%d", &tv)) &&
-       (NULL == strptime (fancy_time, "%Y-%m", &tv)) &&
-       (NULL == strptime (fancy_time, "%Y", &tv)) )
+  if ( (eos != strptime (fancy_time, "%a %b %d %H:%M:%S %Y", &tv)) &&
+       (eos != strptime (fancy_time, "%c", &tv)) &&
+       (eos != strptime (fancy_time, "%Ec", &tv)) &&
+       (eos != strptime (fancy_time, "%Y-%m-%d %H:%M:%S", &tv)) &&
+       (eos != strptime (fancy_time, "%Y-%m-%d %H:%M", &tv)) &&
+       (eos != strptime (fancy_time, "%x", &tv)) &&
+       (eos != strptime (fancy_time, "%Ex", &tv)) &&
+       (eos != strptime (fancy_time, "%Y-%m-%d", &tv)) &&
+       (eos != strptime (fancy_time, "%Y-%m", &tv)) &&
+       (eos != strptime (fancy_time, "%Y", &tv)) )
     return GNUNET_SYSERR;
   t = mktime (&tv);
   atime->abs_value_us = (uint64_t) ((uint64_t) t * 1000LL * 1000LL);
@@ -1262,6 +1266,7 @@ GNUNET_STRINGS_to_address_ipv6 (const char *zt_addr,
   int ret;
   char *port_colon;
   unsigned int port;
+  char dummy[2];
 
   if (addrlen < 6)
     return GNUNET_SYSERR;
@@ -1286,7 +1291,10 @@ GNUNET_STRINGS_to_address_ipv6 (const char *zt_addr,
                _("IPv6 address did contain ']' before ':' to separate port number\n"));
     return GNUNET_SYSERR;
   }
-  ret = SSCANF (port_colon, ":%u", &port);
+  ret = SSCANF (port_colon,
+               ":%u%1s",
+               &port,
+               dummy);
   if ( (1 != ret) || (port > 65535) )
   {
     GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
@@ -1332,16 +1340,18 @@ GNUNET_STRINGS_to_address_ipv4 (const char *zt_addr,
   unsigned int temps[4];
   unsigned int port;
   unsigned int cnt;
+  char dummy[2];
 
   if (addrlen < 9)
     return GNUNET_SYSERR;
   cnt = SSCANF (zt_addr,
-               "%u.%u.%u.%u:%u",
+               "%u.%u.%u.%u:%u%1s",
                &temps[0],
                &temps[1],
                &temps[2],
                &temps[3],
-               &port);
+               &port,
+               dummy);
   if (5 != cnt)
     return GNUNET_SYSERR;
   for (cnt = 0; cnt < 4; cnt++)
@@ -1563,7 +1573,9 @@ parse_port_policy (const char *port_policy,
   }
   if (2 == sscanf (pos,
                    "%u-%u%1s",
-                   &s, &e, eol))
+                   &s,
+                  &e,
+                  eol))
   {
     if ( (0 == s) ||
          (s > 0xFFFF) ||
@@ -1629,7 +1641,8 @@ GNUNET_STRINGS_parse_ipv4_policy (const char *routeListX)
   int colon;
   int end;
   char *routeList;
-
+  char dummy[2];
+  
   if (NULL == routeListX)
     return NULL;
   len = strlen (routeListX);
@@ -1664,7 +1677,7 @@ GNUNET_STRINGS_parse_ipv4_policy (const char *routeListX)
     }
     cnt =
         SSCANF (&routeList[pos],
-                "%u.%u.%u.%u/%u.%u.%u.%u",
+                "%u.%u.%u.%u/%u.%u.%u.%u%1s",
                 &temps[0],
                 &temps[1],
                 &temps[2],
@@ -1672,7 +1685,8 @@ GNUNET_STRINGS_parse_ipv4_policy (const char *routeListX)
                 &temps[4],
                 &temps[5],
                 &temps[6],
-                &temps[7]);
+                &temps[7],
+               dummy);
     if (8 == cnt)
     {
       for (j = 0; j < 8; j++)
@@ -1698,12 +1712,13 @@ GNUNET_STRINGS_parse_ipv4_policy (const char *routeListX)
     /* try second notation */
     cnt =
         SSCANF (&routeList[pos],
-                "%u.%u.%u.%u/%u",
+                "%u.%u.%u.%u/%u%1s",
                 &temps[0],
                 &temps[1],
                 &temps[2],
                 &temps[3],
-                &slash);
+                &slash,
+               dummy);
     if (5 == cnt)
     {
       for (j = 0; j < 4; j++)
@@ -1747,11 +1762,12 @@ GNUNET_STRINGS_parse_ipv4_policy (const char *routeListX)
     slash = 32;
     cnt =
         SSCANF (&routeList[pos],
-                "%u.%u.%u.%u",
+                "%u.%u.%u.%u%1s",
                 &temps[0],
                 &temps[1],
                 &temps[2],
-                &temps[3]);
+                &temps[3],
+               dummy);
     if (4 == cnt)
     {
       for (j = 0; j < 4; j++)
@@ -1826,7 +1842,8 @@ GNUNET_STRINGS_parse_ipv6_policy (const char *routeListX)
   unsigned int off;
   int save;
   int colon;
-
+  char dummy[2];
+  
   if (NULL == routeListX)
     return NULL;
   len = strlen (routeListX);
@@ -1886,7 +1903,11 @@ GNUNET_STRINGS_parse_ipv6_policy (const char *routeListX)
       if (ret <= 0)
       {
         save = errno;
-        if ((1 != SSCANF (&routeList[slash + 1], "%u", &bits)) || (bits > 128))
+        if ( (1 != SSCANF (&routeList[slash + 1],
+                          "%u%1s",
+                          &bits,
+                          dummy)) ||
+            (bits > 128) )
         {
           if (0 == ret)
             LOG (GNUNET_ERROR_TYPE_WARNING,
@@ -1998,7 +2019,6 @@ GNUNET_STRINGS_base64_encode (const void *in,
       opt[ret++] = FILLCHAR;
     }
   }
-  opt[ret++] = FILLCHAR;
   *output = opt;
   return ret;
 }