use GNUNET_strlcpy instead of strncpy where possible
authorlurchi <lurchi@strangeplace.net>
Thu, 27 Jun 2019 08:49:40 +0000 (10:49 +0200)
committerlurchi <lurchi@strangeplace.net>
Thu, 27 Jun 2019 08:49:40 +0000 (10:49 +0200)
17 files changed:
src/arm/gnunet-service-arm.c
src/cadet/gnunet-service-cadet_peer.c
src/exit/gnunet-helper-exit-windows.c
src/regex/regex_test_lib.c
src/testbed/gnunet-helper-testbed.c
src/testbed/gnunet-service-testbed.c
src/testbed/gnunet-service-testbed_oc.c
src/testbed/testbed_api.c
src/testbed/testbed_api_hosts.c
src/transport/tcp_connection_legacy.c
src/transport/tcp_service_legacy.c
src/util/client.c
src/util/common_logging.c
src/util/gnunet-ecc.c
src/util/service.c
src/util/socks.c
src/vpn/gnunet-helper-vpn-windows.c

index 17304d3b3f29f2d4c0252ff4664f8432077f8eff..4e3474cb6558503bc0ffb60a7e87c6d05e5eafe1 100644 (file)
@@ -290,7 +290,7 @@ add_unixpath (struct sockaddr **saddrs,
 
   un = GNUNET_new (struct sockaddr_un);
   un->sun_family = AF_UNIX;
-  strncpy (un->sun_path, unixpath, sizeof (un->sun_path) - 1);
+  GNUNET_strlcpy (un->sun_path, unixpath, sizeof (un->sun_path));
 #ifdef LINUX
   if (GNUNET_YES == abstract)
     un->sun_path[0] = '\0';
index 8d55e6386d32bd172d41cbdf67782875073fe763..c25f46de58eac88c5ce94321f411794bcfe58ae8 100644 (file)
@@ -256,11 +256,10 @@ GCP_2s (const struct CadetPeer *cp)
     return "NULL";
   
   
-  strncpy (buf,
-           ret,
-           sizeof (buf) - 1);
+  GNUNET_strlcpy (buf,
+                  ret,
+                  sizeof (buf));
   GNUNET_free (ret);
-  buf[4] = '\0';
   return buf;
 }
 
index 6633fbc31440aa21d40df34ebfc65f2bb58afcc2..1e17ceaac5039d23e041e65bf540626075bc8b17 100644 (file)
@@ -250,6 +250,37 @@ WINBASEAPI HANDLE WINAPI ReOpenFile (HANDLE, DWORD, DWORD, DWORD);
  */
 typedef BOOL (WINAPI *LPFN_ISWOW64PROCESS) (HANDLE, PBOOL);
 
+
+/**
+ * Like strlcpy but portable. The given string @a src is copied in full length
+ * (until its null byte). The destination buffer is guaranteed to be
+ * null-terminated.
+ *
+ * to a destination buffer
+ * and ensures that the destination string is null-terminated.
+ *
+ * @param dst destination of the copy
+ * @param src source of the copy, must be null-terminated
+ * @param n the length of the string to copy, including its terminating null
+ *          byte
+ * @return the length of the string that was copied, excluding the terminating
+ *        null byte
+ */
+size_t
+GNUNET_strlcpy(char *dst, const char *src, size_t n)
+{
+  size_t ret;
+  size_t slen;
+
+  GNUNET_assert (0 != n);
+  ret = strlen (src);
+  slen = GNUNET_MIN (ret, n - 1);
+  memcpy (dst, src, slen);
+  dst[slen] = '\0';
+  return ret;
+}
+
+
 /**
  * Determines if the host OS is win32 or win64
  *
@@ -473,7 +504,9 @@ setup_interface ()
    * Set the device's hardware ID and add it to a list.
    * This information will later on identify this device in registry.
    */
-  strncpy (hwidlist, HARDWARE_ID, LINE_LEN);
+  str_length = GNUNET_strlcpy (hwidlist,
+                               HARDWARE_ID,
+                               sizeof (hwidlist)) + 1;
   /**
    * this is kind of over-complicated, but allows keeps things independent of
    * how the openvpn-hwid is actually stored.
@@ -481,8 +514,12 @@ setup_interface ()
    * A HWID list is double-\0 terminated and \0 separated
    */
   str_length = strlen (hwidlist) + 1;
-  strncpy (&hwidlist[str_length], secondary_hwid, LINE_LEN);
-  str_length += strlen (&hwidlist[str_length]) + 1;
+  str_length += GNUNET_strlcpy (&hwidlist[str_length],
+                                secondary_hwid,
+                                sizeof (hwidlist) - str_length) + 1;
+  GNUNET_assert (str_length < sizeof (hwidlist));
+  hwidlist[str_length] = '\0';
+  ++str_length;
 
   /**
    * Locate the inf-file, we need to store it somewhere where the system can
@@ -716,9 +753,11 @@ resolve_interface_name ()
           /*
            * we have successfully found OUR instance,
            * save the device GUID before exiting
+           *
+           * We can use GNUNET_strlcpy here because instance key is null-
+           * terminated by RegEnumKeyExA.
            */
-
-          strncpy (device_guid, instance_key, 256);
+          GNUNET_strlcpy (device_guid, instance_key, sizeof (device_guid));
           retval = TRUE;
           fprintf (stderr, "DEBUG: Interface Name lookup succeeded on retry %d, got \"%s\" %s\n", retrys, device_visible_name, device_guid);
 
@@ -1496,7 +1535,7 @@ main (int argc, char **argv)
       return 1;
     }
 
-  strncpy (hwid, argv[1], LINE_LEN);
+  GNUNET_strlcpy (hwid, argv[1], sizeof (hwid));
   hwid[LINE_LEN - 1] = '\0';
 
   /*
index bd1a06a53d944b0f32d2f0fcbd4f01d097f4fe08..7becd567c206d598f277f922b4c9c14a6e2c3f41 100644 (file)
@@ -392,7 +392,10 @@ regex_split (struct RegexCombineCtx *ctx,
   char *suffix;
 
   suffix = GNUNET_malloc (len - prefix_l + 1);
-  strncpy (suffix, &ctx->s[prefix_l], len - prefix_l + 1);
+  /*
+   * We can use GNUNET_strlcpy because ctx->s is null-terminated
+   */
+  GNUNET_strlcpy (suffix, &ctx->s[prefix_l], len - prefix_l + 1);
 
   /* Suffix saved, truncate current node so it only contains the prefix,
    * copy any children nodes to put as grandchildren and initialize new empty
index 25d9724faed00f67c75248266ec146751c673085..c56a795a691dcb77ebd8468d928ee7ae9e6047c4 100644 (file)
@@ -374,6 +374,7 @@ tokenizer_cb (void *cls,
   if (0 != hostname_size)
   {
     hostname = GNUNET_malloc (hostname_size + 1);
+    /* intentionally use strncpy (hostname not null terminated) */
     (void) strncpy (hostname, ((char *) &msg[1]) + trusted_ip_size + 1,
                     hostname_size);
     hostname[hostname_size] = '\0';
index 51460f65b4dc12980ae46b6b0996e7571ea393ab..d740d31bcafa5b447f9df9a5a47f9b865fb5d738 100644 (file)
@@ -541,10 +541,12 @@ handle_add_host (void *cls,
   if (0 != username_length)
   {
     username = GNUNET_malloc (username_length + 1);
+    /* intentionally use strncpy (message payload is not null terminated) */
     strncpy (username, ptr, username_length);
     ptr += username_length;
   }
   hostname = GNUNET_malloc (hostname_length + 1);
+  /* intentionally use strncpy (message payload is not null terminated) */
   strncpy (hostname,
            ptr,
            hostname_length);
index 98a4282dfc7947ed6f1617657e9755b48887a979..4d6a4d446acf997ab2f0285c63ffff28a972a3ba 100644 (file)
@@ -1908,9 +1908,9 @@ handle_remote_overlay_connect (void *cls,
   rocc->a_id = msg->peer_identity;
   GNUNET_TESTING_peer_get_identity (peer->details.local.peer,
                                     &pid);
-  (void) strncpy (pid_str,
-                  GNUNET_i2s (&pid),
-                  15);
+  (void) GNUNET_strlcpy (pid_str,
+                         GNUNET_i2s (&pid),
+                         sizeof (pid_str));
   LOG_DEBUG ("0x%llx: Remote overlay connect %s to peer %s with hello size: %u\n",
              rocc->op_id,
              pid_str,
index 793ed4edd2a3aa4d0367f379b018d5e438d18fda..22ce7eb72392d0a869d565040112b17bdae71d6f 100644 (file)
@@ -2014,6 +2014,7 @@ GNUNET_TESTBED_create_helper_init_msg_ (const char *trusted_ip,
   msg->config_size = htons (config_size);
   (void) strcpy ((char *) &msg[1], trusted_ip);
   if (0 != hostname_len)
+    /* intentionally use strncpy (no null byte needed) */
     (void) strncpy (((char *) &msg[1]) + trusted_ip_len + 1, hostname,
                     hostname_len);
   return msg;
index 327f84f2a6daa24d665cf0d384a24a7b81800c0a..d6521f7664d3618d1b845a5243a0196956edceb7 100644 (file)
@@ -462,6 +462,9 @@ GNUNET_TESTBED_hosts_load_from_file (const char *filename,
       {
         size = pmatch[2].rm_eo - pmatch[2].rm_so;
         username = GNUNET_malloc (size + 1);
+        /*
+         * Intentionally use strncpy (buf is not necessarily null-terminated)
+         */
         username[size] = '\0';
         GNUNET_assert (NULL != strncpy (username, buf + pmatch[2].rm_so, size));
       }
@@ -471,6 +474,9 @@ GNUNET_TESTBED_hosts_load_from_file (const char *filename,
       }
       size = pmatch[3].rm_eo - pmatch[3].rm_so;
       hostname = GNUNET_malloc (size + 1);
+      /*
+       * Intentionally use strncpy (buf is not necessarily null-terminated)
+       */
       hostname[size] = '\0';
       GNUNET_assert (NULL != strncpy (hostname, buf + pmatch[3].rm_so, size));
       LOG (GNUNET_ERROR_TYPE_DEBUG,
index 6ecf50b79666e92cc1e3b8b94c291e6a45397bfa..cfb0883618d5fb9d2ac1c446aa6c22e9b20130c0 100644 (file)
@@ -901,7 +901,7 @@ GNUNET_CONNECTION_create_from_connect_to_unixpath (const struct GNUNET_CONFIGURA
   GNUNET_assert (0 < strlen (unixpath));        /* sanity check */
   un = GNUNET_new (struct sockaddr_un);
   un->sun_family = AF_UNIX;
-  strncpy (un->sun_path, unixpath, sizeof (un->sun_path) - 1);
+  GNUNET_strlcpy (un->sun_path, unixpath, sizeof (un->sun_path));
 #ifdef LINUX
   {
     int abstract;
index 641d0195a3455a319693a6f0a7fb10c072bd4bfe..19508a39f0fe13bf8b59a4226a32474073db117a 100644 (file)
@@ -468,7 +468,7 @@ add_unixpath (struct sockaddr **saddrs,
 
   un = GNUNET_new (struct sockaddr_un);
   un->sun_family = AF_UNIX;
-  strncpy (un->sun_path, unixpath, sizeof (un->sun_path) - 1);
+  GNUNET_strlcpy (un->sun_path, unixpath, sizeof (un->sun_path));
 #ifdef LINUX
   if (GNUNET_YES == abstract)
     un->sun_path[0] = '\0';
index 05e05a328b26161116eabf4c6f48e893109e8d13..313cc23af32223b7e2f4a82c3d5232b9df9be42e 100644 (file)
@@ -532,9 +532,9 @@ try_unixpath (const char *service_name,
             0,
             sizeof (s_un));
     s_un.sun_family = AF_UNIX;
-    strncpy (s_un.sun_path,
-             unixpath,
-             sizeof (s_un.sun_path) - 1);
+    GNUNET_strlcpy (s_un.sun_path,
+                    unixpath,
+                    sizeof (s_un.sun_path));
 #ifdef LINUX
     {
       int abstract;
index b5678e5bed9022fc084830e1c575b9da39b5e141..3193878b81fb113216966c33a2b072f6804d3a2d 100644 (file)
@@ -1082,11 +1082,11 @@ mylog (enum GNUNET_ErrorType kind,
       return;
     }
     flush_bulk (date);
-    strncpy (last_bulk, buf, sizeof (last_bulk));
+    GNUNET_strlcpy (last_bulk, buf, sizeof (last_bulk));
     last_bulk_repeat = 0;
     last_bulk_kind = kind;
     last_bulk_time = GNUNET_TIME_absolute_get ();
-    strncpy (last_bulk_comp, comp, COMP_TRACK_SIZE);
+    GNUNET_strlcpy (last_bulk_comp, comp, sizeof (last_bulk_comp));
     output_message (kind, comp, date, buf);
   }
 }
@@ -1364,9 +1364,8 @@ GNUNET_i2s (const struct GNUNET_PeerIdentity *pid)
   if (NULL == pid)
     return "NULL";
   ret = GNUNET_CRYPTO_eddsa_public_key_to_string (&pid->public_key);
-  strncpy (buf, ret, sizeof (buf) - 1);
+  GNUNET_strlcpy (buf, ret, sizeof (buf));
   GNUNET_free (ret);
-  buf[4] = '\0';
   return buf;
 }
 
@@ -1390,9 +1389,8 @@ GNUNET_i2s2 (const struct GNUNET_PeerIdentity *pid)
   if (NULL == pid)
     return "NULL";
   ret = GNUNET_CRYPTO_eddsa_public_key_to_string (&pid->public_key);
-  strncpy (buf, ret, sizeof (buf) - 1);
+  GNUNET_strlcpy (buf, ret, sizeof (buf));
   GNUNET_free (ret);
-  buf[4] = '\0';
   return buf;
 }
 
index 27ef59c9f9a4c180a55dd279f7bd91b359b2aa35..94ffb4308f7d5c286f404fc9af990d7010435868 100644 (file)
@@ -96,7 +96,7 @@ create_keys (const char *fn, const char *prefix)
   }
   if (NULL != prefix)
   {
-    strncpy (vanity, prefix, KEY_STR_LEN);
+    GNUNET_strlcpy (vanity, prefix, sizeof (vanity));
     len = GNUNET_MIN (strlen (prefix), KEY_STR_LEN);
     n = len * 5 / 8;
     rest = len * 5 % 8;
index 4fd16f93d8386b1624f80e763167c8b1c642ee9b..d03650501cb894dd8374f256f622a8283f85ca65 100644 (file)
@@ -1061,9 +1061,9 @@ add_unixpath (struct sockaddr **saddrs,
 
   un = GNUNET_new (struct sockaddr_un);
   un->sun_family = AF_UNIX;
-  strncpy (un->sun_path,
-          unixpath,
-          sizeof (un->sun_path) - 1);
+  GNUNET_strlcpy (un->sun_path,
+                 unixpath,
+                 sizeof (un->sun_path));
 #ifdef LINUX
   if (GNUNET_YES == abstract)
     un->sun_path[0] = '\0';
index 7eca0487825e6a2ee28972202fc9f036bffe0923..9e974e6bb58efcfb0deee5e468b4ae2ea2daef49 100644 (file)
@@ -76,7 +76,7 @@ const char * SOCKS5_REP_names(int rep)
 
 /**
  * Encode a string for the SOCKS5 protocol by prefixing it a byte stating its
- * length and stipping the trailing zero byte.  Truncates any string longer
+ * length and stripping the trailing zero byte.  Truncates any string longer
  * than 255 bytes.
  *
  * @param b buffer to contain the encoded string
@@ -96,7 +96,10 @@ SOCK5_proto_string(unsigned char * b,
     l=255;
   }
   *(b++) = (unsigned char) l;
-  strncpy ((char *)b, s, l);
+  /*
+   * intentionally use strncpy (trailing zero byte must be stripped in b)
+   */
+  strncpy ((char*)b, s, l);
   return b+l;
 }
 
@@ -489,7 +492,7 @@ GNUNET_SOCKS_init_handshake_noauth ()
  */
 void
 GNUNET_SOCKS_set_handshake_destination (struct GNUNET_SOCKS_Handshake *ih,
-                                         const char *host, uint16_t port)
+                                        const char *host, uint16_t port)
 {
   union {
     struct in_addr in4;
index 14c0c3fecdb53a0b53cacd9273cc183bc3ed9601..4ccecb873d978da50351ba6e61d14b9532f090da 100644 (file)
@@ -250,6 +250,37 @@ WINBASEAPI HANDLE WINAPI ReOpenFile (HANDLE, DWORD, DWORD, DWORD);
  */
 typedef BOOL (WINAPI *LPFN_ISWOW64PROCESS) (HANDLE, PBOOL);
 
+
+/**
+ * Like strlcpy but portable. The given string @a src is copied in full length
+ * (until its null byte). The destination buffer is guaranteed to be
+ * null-terminated.
+ *
+ * to a destination buffer
+ * and ensures that the destination string is null-terminated.
+ *
+ * @param dst destination of the copy
+ * @param src source of the copy, must be null-terminated
+ * @param n the length of the string to copy, including its terminating null
+ *          byte
+ * @return the length of the string that was copied, excluding the terminating
+ *        null byte
+ */
+size_t
+GNUNET_strlcpy(char *dst, const char *src, size_t n)
+{
+  size_t ret;
+  size_t slen;
+
+  GNUNET_assert (0 != n);
+  ret = strlen (src);
+  slen = GNUNET_MIN (ret, n - 1);
+  memcpy (dst, src, slen);
+  dst[slen] = '\0';
+  return ret;
+}
+
+
 /**
  * Determines if the host OS is win32 or win64
  *
@@ -476,16 +507,21 @@ setup_interface ()
    * Set the device's hardware ID and add it to a list.
    * This information will later on identify this device in registry.
    */
-  strncpy (hwidlist, HARDWARE_ID, LINE_LEN);
+  str_len = GNUNET_strlcpy (hwidlist,
+                            HARDWARE_ID,
+                            sizeof (hwidList)) + 1;
   /**
    * this is kind of over-complicated, but allows keeps things independent of
    * how the openvpn-hwid is actually stored.
    *
    * A HWID list is double-\0 terminated and \0 separated
    */
-  str_length = strlen (hwidlist) + 1;
-  strncpy (&hwidlist[str_length], secondary_hwid, LINE_LEN);
-  str_length += strlen (&hwidlist[str_length]) + 1;
+  str_len += GNUNET_strlcpy (&hwidlist[str_length],
+                             secondary_hwid,
+                             sizeof (hwidlist) - str_len) + 1;
+  GNUNET_assert (str_len < sizeof (hwidlist));
+  hwidlist[str_len] = '\0';
+  ++str_len;
 
   /**
    * Locate the inf-file, we need to store it somewhere where the system can
@@ -719,9 +755,11 @@ resolve_interface_name ()
           /*
            * we have successfully found OUR instance,
            * save the device GUID before exiting
+           *
+           * We can use GNUNET_strlcpy here because instance key is null-
+           * terminated by RegEnumKeyExA.
            */
-
-          strncpy (device_guid, instance_key, 256);
+          GNUNET_strlcpy (device_guid, instance_key, sizeof (device_guid));
           retval = TRUE;
           fprintf (stderr, "DEBUG: Interface Name lookup succeeded on retry %d, got \"%s\" %s\n", retrys, device_visible_name, device_guid);
 
@@ -1494,7 +1532,7 @@ main (int argc, char **argv)
       return 1;
     }
 
-  strncpy (hwid, argv[1], LINE_LEN);
+  GNUNET_strlcpy (hwid, argv[1], sizeof (hwid));
   hwid[LINE_LEN - 1] = '\0';
 
   /*