(re-)corrected aaros BSD-do-not-warn changes and added new strscpy instead
authorSven-Ola Tuecke <sven-ola@gmx.de>
Sat, 26 Jul 2008 10:13:12 +0000 (12:13 +0200)
committerSven-Ola Tuecke <sven-ola@gmx.de>
Sat, 26 Jul 2008 10:13:12 +0000 (12:13 +0200)
20 files changed:
lib/httpinfo/src/admin_interface.c
lib/httpinfo/src/olsrd_httpinfo.c
lib/nameservice/src/compat.c
lib/nameservice/src/nameservice.c
lib/quagga/src/quagga.c
lib/secure/src/olsrd_secure.c
src/bsd/net.c
src/cfgparser/oscan.lex
src/defs.h
src/interfaces.c
src/link_set.c
src/linux/link_layer.c
src/linux/net.c
src/lq_plugin.c
src/main.c
src/olsr_switch/ohs_cmd.c
src/plugin_util.c
src/unix/ifnet.c
src/win32/compat.c
src/win32/ifnet.c

index 335156c..6d4b526 100644 (file)
@@ -336,9 +336,9 @@ process_param(char *key, char *value)
       while(key[7 + seperator] != '*') {
        seperator++;
       }
-      strncpy(ip_net, &key[7], seperator);
+      memcpy(ip_net, &key[7], seperator);
       ip_net[seperator] = 0;
-      strncpy(ip_mask, &key[7 + seperator + 1], 16);
+      memcpy(ip_mask, &key[7 + seperator + 1], 16);
       olsr_printf(1, "Deleting HNA %s/%s\n", ip_net, ip_mask);
 
       if(inet_aton(ip_net, &net) == 0)
index 19aa6e1..cfd3ab5 100644 (file)
@@ -414,7 +414,7 @@ parse_http_request(int fd)
     }
 #endif
     /* We only support GET */
-    strcpy(body, HTTP_400_MSG);
+    strscpy(body, HTTP_400_MSG, sizeof(body));
     stats.ill_hits++;
     c = build_http_header(HTTP_BAD_REQ, OLSR_TRUE, strlen(body), req, sizeof(req));
   } else if (!strcmp(req_type, "GET")) {
@@ -523,11 +523,11 @@ parse_http_request(int fd)
 
 
     stats.ill_hits++;
-    strcpy(body, HTTP_404_MSG);
+    strscpy(body, HTTP_404_MSG, sizeof(body));
     c = build_http_header(HTTP_BAD_FILE, OLSR_TRUE, strlen(body), req, sizeof(req));
   } else {
     /* We only support GET */
-    strcpy(body, HTTP_400_MSG);
+    strscpy(body, HTTP_400_MSG, sizeof(body));
     stats.ill_hits++;
     c = build_http_header(HTTP_BAD_REQ, OLSR_TRUE, strlen(body), req, sizeof(req));
   }
index 10b1ac8..81ddd47 100644 (file)
@@ -19,7 +19,7 @@ strndup(const char *ptr, size_t size)
   if(!ret)
     return NULL;
 
-  strncpy(ret, ptr, len);
+  memcpy(ret, ptr, len);
   ret[len] = '\0';
 
   return ret;
index 6036bc0..148e5d7 100644 (file)
@@ -136,22 +136,22 @@ name_constructor(void)
 
        len = strlen(my_hosts_file);
        if (my_hosts_file[len - 1] != '\\')
-               my_hosts_file[len++] = '\\';
-       strcpy(my_hosts_file + len, "hosts_olsr");
+               strscat(my_hosts_file, "\\", sizeof(my_host_file));
+       strscat(my_hosts_file, "hosts_olsr", sizeof(my_host_file));
        
        len = strlen(my_services_file);
        if (my_services_file[len - 1] != '\\')
-               my_services_file[len++] = '\\';
-       strcpy(my_services_file + len, "services_olsr");
+               strscat(my_services_file, "\\", sizeof(my_services_file));
+       strscat(my_services_file, "services_olsr", sizeof(my_services_file));
 
        len = strlen(my_resolv_file);
        if (my_resolv_file[len - 1] != '\\')
-               my_resolv_file[len++] = '\\';
-       strcpy(my_resolv_file + len, "resolvconf_olsr");
+               strscat(my_resolv_file, "\\", sizeof(my_resolv_file));
+       strscat(my_resolv_file, "resolvconf_olsr", sizeof(my_resolv_file));
 #else
-       strcpy(my_hosts_file, "/var/run/hosts_olsr");
-       strcpy(my_services_file, "/var/run/services_olsr");
-       strcpy(my_resolv_file, "/var/run/resolvconf_olsr");
+       strscpy(my_hosts_file, "/var/run/hosts_olsr", sizeof(my_hosts_file));
+       strscpy(my_services_file, "/var/run/services_olsr", sizeof(my_services_file));
+       strscpy(my_resolv_file, "/var/run/resolvconf_olsr", sizeof(my_resolv_file));
        *my_sighup_pid_file = 0;
 #endif
 
@@ -317,7 +317,8 @@ name_init(void)
        //regex string for validating the hostnames
        const char *regex_name = "^[[:alnum:]_.-]+$";
        //regex string for the service line
-       char *regex_service = olsr_malloc(256*sizeof(char) + strlen(my_suffix), "new *char from name_init for regex_service");
+       size_t regex_size = 256 * sizeof(char) + strlen(my_suffix);
+       char *regex_service = olsr_malloc(regex_size, "new *char from name_init for regex_service");
        memset(&ipz, 0, sizeof(ipz));
 
        //compile the regex from the string
@@ -342,9 +343,9 @@ name_init(void)
        //regex_service = "^[[:alnum:]]+://(([[:alnum:]_.-]+.olsr)|([[:digit:]]{1,3}\\.[[:digit:]]{1,3}\\.[[:digit:]]{1,3}\\.[[:digit:]]{1,3}))
        //                 :    port              /path      |(tcp OR udp) |short description
        //                 :[[:digit:]]+[[:alnum:]/?._=#-]*\\|(tcp|udp)\\|[^|[:cntrl:]]+$";
-    strcpy(regex_service, "^[[:alnum:]]+://(([[:alnum:]_.-]+");
-    strcat(regex_service, my_suffix);
-       strcat(regex_service, ")|([[:digit:]]{1,3}\\.[[:digit:]]{1,3}\\.[[:digit:]]{1,3}\\.[[:digit:]]{1,3})):[[:digit:]]+[[:alnum:]/?._=#-]*\\|(tcp|udp)\\|[^|[:cntrl:]]+$");
+       strscpy(regex_service, "^[[:alnum:]]+://(([[:alnum:]_.-]+", regex_size);
+       strscat(regex_service, my_suffix, regex_size);
+       strscat(regex_service, ")|([[:digit:]]{1,3}\\.[[:digit:]]{1,3}\\.[[:digit:]]{1,3}\\.[[:digit:]]{1,3})):[[:digit:]]+[[:alnum:]/?._=#-]*\\|(tcp|udp)\\|[^|[:cntrl:]]+$", regex_size);
 
        /* #1: call regcomp() to compile the regex */
        if ((ret = regcomp(&regex_t_service, regex_service , REG_EXTENDED )) != 0)
@@ -776,7 +777,7 @@ create_packet(struct name* to, struct name_entry *from)
        to->len = htons(from->len);
        to->ip = from->ip;
        pos += sizeof(struct name);
-       strncpy(pos, from->name, from->len);
+       memcpy(pos, from->name, from->len);
        pos += from->len;
        for (k = from->len; (k & 3) != 0; k++)
                *pos++ = '\0';
@@ -837,7 +838,7 @@ decap_namemsg(struct name *from_packet, struct name_entry **to, olsr_bool *this_
                                        olsr_ip_to_string(&strbuf, &already_saved_name_entries->ip));
                                free(already_saved_name_entries->name);
                                already_saved_name_entries->name = olsr_malloc(len_of_name + 1, "upd name_entry name");
-                               strncpy(already_saved_name_entries->name, name, len_of_name);
+                               strscpy(already_saved_name_entries->name, name, len_of_name + 1);
 
                                *this_table_changed = OLSR_TRUE;
                                olsr_start_write_file_timer();
@@ -869,10 +870,9 @@ decap_namemsg(struct name *from_packet, struct name_entry **to, olsr_bool *this_
        tmp = olsr_malloc(sizeof(struct name_entry), "new name_entry");         
        tmp->type = ntohs(from_packet->type);
        tmp->len = len_of_name > MAX_NAME ? MAX_NAME : ntohs(from_packet->len);
-       tmp->name = olsr_malloc(tmp->len+1, "new name_entry name");
+       tmp->name = olsr_malloc(tmp->len + 1, "new name_entry name");
        tmp->ip = from_packet->ip;
-       strncpy(tmp->name, name, tmp->len);
-       tmp->name[tmp->len] = '\0';
+       strscpy(tmp->name, name, tmp->len + 1);
 
        OLSR_PRINTF(3, "\nNAME PLUGIN: create new name/service/forwarder entry %s (%s) [len=%d] [type=%d] in linked list\n", 
                tmp->name, olsr_ip_to_string(&strbuf, &tmp->ip), tmp->len, tmp->type);
index 7a87779..6ee4d33 100644 (file)
@@ -241,7 +241,7 @@ static void zebra_connect (void) {
   i.sin_addr.s_addr = htonl (INADDR_LOOPBACK);
 #else
   i.sun_family = AF_UNIX;
-  strcpy (i.sun_path, ZEBRA_SOCKET);
+  strscpy (i.sun_path, ZEBRA_SOCKET, sizeof(i.sun_path));
 #endif
 
   ret = connect (zebra.sock, (struct sockaddr *)&i, sizeof i);
index ffa9643..b253bcc 100644 (file)
@@ -178,7 +178,7 @@ secure_plugin_init(void)
   olsr_printf(1, "Timestamp database initialized\n");
 
   if(!strlen(keyfile))
-    strcpy(keyfile, KEYFILE);
+    strscpy(keyfile, KEYFILE, sizeof(keyfile));
 
   i = read_key_from_file(keyfile);
 
index 813876e..0c7e39e 100644 (file)
@@ -554,7 +554,7 @@ get_ipv6_address(char *ifname, struct sockaddr_in6 *saddr6, int scope_in)
       sin6 = (const struct sockaddr_in6 *)(ifa->ifa_addr);
       if (IN6_IS_ADDR_LINKLOCAL(&sin6->sin6_addr))
        continue;
-      strncpy(ifr6.ifr_name, ifname, sizeof(ifr6.ifr_name));
+      strscpy(ifr6.ifr_name, ifname, sizeof(ifr6.ifr_name));
       if ((s6 = socket(AF_INET6, SOCK_DGRAM, 0)) < 0) {
        OLSR_PRINTF(3, "socket(AF_INET6,SOCK_DGRAM)");
        break;
index 6fce866..9fc4838 100644 (file)
@@ -88,14 +88,14 @@ static struct conf_token *get_string_token(const char * const s, const size_t n)
 {
     struct conf_token *rv = get_conf_token();
     if (rv != NULL) {
-        rv->string = malloc(n+1);
+        rv->string = malloc(n + 1);
         if (rv->string == NULL) {
-          fprintf(stderr, "Cannot allocate %lu bytes for string token data.\n", (unsigned long)(n+1)); /* size_t on 64bit */
+          fprintf(stderr, "Cannot allocate %lu bytes for string token data.\n", (unsigned long)n); /* size_t on 64bit */
             free(rv);
             return NULL;
         }
-        strncpy(rv->string, s, n);
-        rv->string[n] = '\0';
+        memcpy(rv->string, s, n);
+       rv->string[n] = '\0';
     }
     return rv;
 }
index 7eb4964..0bab201 100644 (file)
@@ -115,6 +115,35 @@ extern FILE *debug_handle;
 #define INLINE inline __attribute__((always_inline))
 
 /*
+ * A somewhat safe version of strncpy and strncat. Note, that
+ * BSD/Solaris strlcpy()/strlcat() differ in implementation, while
+ * the BSD compiler prints out a warning if you use plain strcpy().
+ */
+static INLINE char *strscpy(char *dest, const char *src, size_t size)
+{
+       register size_t l = 0;
+#if !defined(NODEBUG) && defined(DEBUG)
+       if (sizeof(dest) == size) fprintf(stderr, "Warning: probably sizeof(pointer) in strscpy(%p, %s, %d)!\n", dest, src, size);
+       if (NULL == dest) fprintf(stderr, "Warning: dest is NULL in strscpy!\n");
+       if (NULL == src) fprintf(stderr, "Warning: src is NULL in strscpy!\n");
+#endif
+       if (NULL != dest && NULL != src)
+       {
+               /* src does not need to be null terminated */
+               if (0 < size--) while(l < size && 0 != src[l]) l++;
+               dest[l] = 0;
+       }
+       return strncpy(dest, src, l);
+}
+
+static INLINE char *strscat(char *dest, const char *src, size_t size)
+{
+       register size_t l = strlen(dest);
+       return strscpy(dest + l, src, size > l ? size - l : 0);
+}
+
+/*
  * Queueing macros
  */
 
index 48a7df8..2985e7b 100644 (file)
@@ -242,6 +242,7 @@ struct olsr_if *
 queue_if(const char *name, int hemu)
 {
   struct olsr_if *interf_n = olsr_cnf->interfaces;
+  size_t name_size;
 
   //printf("Adding interface %s\n", name);
 
@@ -258,15 +259,15 @@ queue_if(const char *name, int hemu)
 
   interf_n = olsr_malloc(sizeof(struct olsr_if), "queue interface");
 
-  /* strlen () does not return length including terminating /0 */
-  interf_n->name = olsr_malloc(strlen(name) + 1, "queue interface name");
+  name_size = strlen(name) + 1;
+  interf_n->name = olsr_malloc(name_size, "queue interface name");
   interf_n->cnf = NULL;
   interf_n->interf = NULL;
   interf_n->configured = 0;
 
   interf_n->host_emul = hemu ? OLSR_TRUE : OLSR_FALSE;
 
-  strncpy(interf_n->name, name, strlen(name) + 1);
+  strscpy(interf_n->name, name, name_size);
   interf_n->next = olsr_cnf->interfaces;
   olsr_cnf->interfaces = interf_n;
 
index 370df9a..5a3fdce 100644 (file)
@@ -501,7 +501,6 @@ add_link_entry(const union olsr_ip_addr *local,
   struct link_entry *new_link;
   struct neighbor_entry *neighbor;
   struct link_entry *tmp_link_set;
-  int ifnamelen=-1;
 
   tmp_link_set = lookup_link_entry(remote, remote_main, local_if);
   if (tmp_link_set) {
@@ -529,10 +528,10 @@ add_link_entry(const union olsr_ip_addr *local,
 
   /* copy if_name, if it is defined */
   if (local_if->int_name) {
-    ifnamelen = strlen(local_if->int_name)+1;
+    size_t name_size = strlen(local_if->int_name) + 1;
     new_link->if_name =
-      olsr_malloc(ifnamelen, "target of if_name in new link entry");
-    strncpy(new_link->if_name, local_if->int_name, ifnamelen);
+      olsr_malloc(name_size, "target of if_name in new link entry");
+    strscpy(new_link->if_name, local_if->int_name, name_size);
   } else
     new_link->if_name = NULL;
 
index ddc95b1..3aa9b2a 100644 (file)
@@ -116,7 +116,7 @@ clear_spy_list(char *ifname)
   wrq.u.data.flags = 0;
 
   /* Set device name */
-  strncpy(wrq.ifr_name, ifname, IFNAMSIZ);
+  strscpy(wrq.ifr_name, ifname, sizeof(wrq.ifr_name));
 
   if(ioctl(olsr_cnf->ioctl_s, SIOCSIWSPY, &wrq) < 0)
     {
@@ -147,7 +147,7 @@ add_spy_node(union olsr_ip_addr *addr, char *interface)
   wrq.u.data.length = IW_MAX_SPY;
   wrq.u.data.flags = 0;
 
-  strncpy(wrq.ifr_name, interface, IFNAMSIZ);
+  strscpy(wrq.ifr_name, interface, sizeof(wrq.ifr_name));
 
   if(ioctl(olsr_cnf->ioctl_s, SIOCGIWSPY, &wrq) < 0)
     {
@@ -180,7 +180,7 @@ add_spy_node(union olsr_ip_addr *addr, char *interface)
   wrq.u.data.flags = 0;
   
   /* Set device name */
-  strncpy(wrq.ifr_name, interface, IFNAMSIZ);
+  strscpy(wrq.ifr_name, interface, sizeof(wrq.ifr_name));
   
   if(ioctl(olsr_cnf->ioctl_s, SIOCSIWSPY, &wrq) < 0)
     {
@@ -216,7 +216,7 @@ convert_ip_to_mac(union olsr_ip_addr *ip, struct sockaddr *mac, char *interface)
   arp_query.arp_ha.sa_family = 0;
   arp_query.arp_flags = 0;
 
-  strncpy(arp_query.arp_dev, interface, IFNAMSIZ);
+  strscpy(arp_query.arp_dev, interface, sizeof(arp_query.arp_dev));
   
   if((ioctl(olsr_cnf->ioctl_s, SIOCGARP, &arp_query) < 0) ||
      !(arp_query.arp_flags & ATF_COM)) /* ATF_COM - hw addr valid */
@@ -323,7 +323,7 @@ poll_link_layer(void *foo)
       wrq.u.data.flags = 0;
       
       /* Set device name */
-      strncpy(wrq.ifr_name, iflist->int_name, IFNAMSIZ);
+      strscpy(wrq.ifr_name, iflist->int_name, sizeof(wrq.ifr_name));
       
       /* Do the request */
       if(ioctl(olsr_cnf->ioctl_s, SIOCGIWSPY, &wrq) < 0)
@@ -398,7 +398,7 @@ iw_get_range_info(char            *ifname,
   wrq.u.data.flags = 0;
 
   /* Set device name */
-  strncpy(wrq.ifr_name, ifname, IFNAMSIZ);
+  strscpy(wrq.ifr_name, ifname, sizeof(wrq.ifr_name));
 
   if(ioctl(olsr_cnf->ioctl_s, SIOCGIWRANGE, &wrq) < 0)
     {
index 53586fc..c17f339 100644 (file)
@@ -750,7 +750,7 @@ check_wireless_interface(char * ifname)
   struct ifreq ifr;
 
   memset(&ifr, 0, sizeof(ifr));
-  strncpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name));
+  strscpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name));
 
   return (ioctl(olsr_cnf->ioctl_s, SIOCGIWNAME, &ifr) >= 0) ? 1 : 0;
 }
@@ -802,7 +802,7 @@ calculate_if_metric(char *ifname)
   if(check_wireless_interface(ifname))
     {
       struct ifreq ifr;
-      strncpy(ifr.ifr_name, ifname, IFNAMSIZ);
+      strscpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name));
       
       /* Get bit rate */
       if(ioctl(olsr_cnf->ioctl_s, SIOCGIWRATE, &ifr) < 0)
@@ -826,7 +826,7 @@ calculate_if_metric(char *ifname)
       struct mii_data *mii = (struct mii_data *)&ifr.ifr_data;
       int bmcr;
       memset(&ifr, 0, sizeof(ifr));
-      strncpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name));
+      strscpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name));
 
       if (ioctl(olsr_cnf->ioctl_s, SIOCGMIIPHY, &ifr) < 0) {
        if (errno != ENODEV)
@@ -876,7 +876,7 @@ is_if_link_up(char *ifname)
       struct mii_data *mii = (struct mii_data *)&ifr.ifr_data;
       int bmsr;
       memset(&ifr, 0, sizeof(ifr));
-      strncpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name));
+      strscpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name));
 
       if (ioctl(olsr_cnf->ioctl_s, SIOCGMIIPHY, &ifr) < 0) {
        if (errno != ENODEV)
index 638dbce..48c64ca 100644 (file)
@@ -90,10 +90,11 @@ void
 register_lq_handler(struct lq_handler *handler, const char *name)
 {
   struct lq_handler_node *node;
+  size_t name_size = sizeof(*node) + strlen(name) + 1;
   
-  node = olsr_malloc(sizeof(*node) + strlen(name)+1, "olsr lq handler");
+  node = olsr_malloc(name_size, "olsr lq handler");
    
-  strncpy(node->name, name, strlen(name));
+  strscpy(node->name, name, name_size);
   node->node.key = node->name;
   node->handler = handler;
   
index b037af2..7399c08 100644 (file)
@@ -114,7 +114,7 @@ main(int argc, char *argv[])
 #endif
 #ifdef WIN32
   WSADATA WsaData;
-  int len;
+  size_t len;
 #endif
 
   /* paranoia checks */
@@ -182,9 +182,9 @@ main(int argc, char *argv[])
   if (len == 0 || conf_file_name[len - 1] != '\\')
     conf_file_name[len++] = '\\';
   
-  strncpy(conf_file_name + len, "olsrd.conf", FILENAME_MAX);
+  strscpy(conf_file_name + len, "olsrd.conf", sizeof(conf_file_name) - len);
 #else
-  strncpy(conf_file_name, OLSRD_GLOBAL_CONF_FILE, FILENAME_MAX);
+  strscpy(conf_file_name, OLSRD_GLOBAL_CONF_FILE, sizeof(conf_file_name));
 #endif
 
   if ((argc > 1) && (strcmp(argv[1], "-f") == 0)) 
@@ -204,7 +204,7 @@ main(int argc, char *argv[])
          exit(EXIT_FAILURE);
        }
                 
-      strncpy(conf_file_name, argv[1], FILENAME_MAX);
+      strscpy(conf_file_name, argv[1], sizeof(conf_file_name));
       argv++; argc--;
 
     }
index 5ffd430..3188f8f 100644 (file)
@@ -91,7 +91,7 @@ get_next_token(const char *src, char *dst, size_t buflen)
 int
 ohs_set_olsrd_path(const char *path)
 {
-  strncpy(olsrd_path, path, FILENAME_MAX);
+  strscpy(olsrd_path, path, sizeof(olsrd_path));
   return 0;
 }
 
index f94279f..d9f3dda 100644 (file)
@@ -126,7 +126,7 @@ int set_plugin_string(const char *value, void *data, set_plugin_parameter_addon
             OLSR_PRINTF(0, "String too long \"%s\"", value);
             return 1;
         }
-        strncpy(v, value, addon.ui -1 );
+        strscpy(v, value, addon.ui);
         OLSR_PRINTF(1, "%s string %s\n", "Got", value);
     } else {
         OLSR_PRINTF(0, "%s string %s\n", "Ignored", value);
index 39628f4..bfcc05b 100644 (file)
@@ -75,7 +75,7 @@ set_flag(char *ifname, short flag __attribute__((unused)))
 {
   struct ifreq ifr;
 
-  strncpy(ifr.ifr_name, ifname, IFNAMSIZ);
+  strscpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name));
 
   /* Get flags */
   if (ioctl(olsr_cnf->ioctl_s, SIOCGIFFLAGS, &ifr) < 0) 
@@ -84,7 +84,7 @@ set_flag(char *ifname, short flag __attribute__((unused)))
       return -1;
     }
 
-  strncpy(ifr.ifr_name, ifname, IFNAMSIZ);
+  strscpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name));
   
   //printf("Setting flags for if \"%s\"\n", ifr.ifr_name);
 
@@ -178,7 +178,7 @@ chk_if_changed(struct olsr_if *iface)
     }
 
   memset(&ifr, 0, sizeof(struct ifreq));
-  strncpy(ifr.ifr_name, iface->name, IFNAMSIZ);
+  strscpy(ifr.ifr_name, iface->name, sizeof(ifr.ifr_name));
 
 
   /* Get flags (and check if interface exists) */
@@ -502,6 +502,7 @@ add_hemu_if(struct olsr_if *iface)
   union olsr_ip_addr null_addr;
   olsr_u32_t addr[4];
   struct ipaddr_str buf;
+  size_t name_size;
 
   if(!iface->host_emul)
     return -1;
@@ -513,11 +514,12 @@ add_hemu_if(struct olsr_if *iface)
   iface->configured = OLSR_TRUE;
   iface->interf = ifp;
 
+  name_size = strlen("hcif01") + 1;
   ifp->is_hcif = OLSR_TRUE;
-  ifp->int_name = olsr_malloc(strlen("hcif01") + 1, "Interface update 3");
+  ifp->int_name = olsr_malloc(name_size, "Interface update 3");
   ifp->int_metric = 0;
 
-  strcpy(ifp->int_name, "hcif01");
+  strscpy(ifp->int_name, "hcif01", name_size);
 
   OLSR_PRINTF(1, "Adding %s(host emulation):\n", ifp->int_name);
 
@@ -680,6 +682,7 @@ chk_if_up(struct olsr_if *iface, int debuglvl __attribute__((unused)))
   struct interface ifs, *ifp;
   struct ifreq ifr;
   union olsr_ip_addr null_addr;
+  size_t name_size;
 #ifdef linux
   int precedence = IPTOS_PREC(olsr_cnf->tos);
   int tos_bits = IPTOS_TOS(olsr_cnf->tos);
@@ -690,7 +693,7 @@ chk_if_up(struct olsr_if *iface, int debuglvl __attribute__((unused)))
 
   memset(&ifr, 0, sizeof(struct ifreq));
   memset(&ifs, 0, sizeof(struct interface));
-  strncpy(ifr.ifr_name, iface->name, IFNAMSIZ);
+  strscpy(ifr.ifr_name, iface->name, sizeof(ifr.ifr_name));
 
   OLSR_PRINTF(debuglvl, "Checking %s:\n", ifr.ifr_name);
 
@@ -880,9 +883,10 @@ chk_if_up(struct olsr_if *iface, int debuglvl __attribute__((unused)))
   /* XXX bad code */
   memcpy(ifp, &ifs, sizeof(struct interface));
   
+  name_size = strlen(if_basename(ifr.ifr_name)) + 1;
   ifp->gen_properties = NULL;
-  ifp->int_name = olsr_malloc(strlen(if_basename(ifr.ifr_name)) + 1, "Interface update 3");
-  strcpy(ifp->int_name, if_basename(ifr.ifr_name));
+  ifp->int_name = olsr_malloc(name_size, "Interface update 3");
+  strscpy(ifp->int_name, if_basename(ifr.ifr_name), name_size);
   ifp->int_next = ifnet;
   ifnet = ifp;
 
index e2ecec2..2866245 100644 (file)
@@ -150,7 +150,7 @@ char *StrError(unsigned int ErrNo)
 
   if (WideCharToMultiByte(CP_ACP, 0, WideMsg, -1, Msg, sizeof (Msg),
                           NULL, NULL) == 0)
-    strcpy(Msg, "[cannot convert string]");
+  strscpy(Msg, "[cannot convert string]", sizeof(Msg));
 #endif
 
   return Msg;
@@ -389,7 +389,7 @@ static char *inet_ntop4(const unsigned char *src, char *dst, int size)
   if (sprintf(tmp, fmt, src[0], src[1], src[2], src[3]) > size)
     return (NULL);
 
-  return strcpy(dst, tmp);
+  return strscpy(dst, tmp, size);
 }
 
 static char *inet_ntop6(const unsigned char *src, char *dst, int size)
@@ -477,7 +477,7 @@ static char *inet_ntop6(const unsigned char *src, char *dst, int size)
   if ((tp - tmp) > size)
     return (NULL);
 
-  return strcpy(dst, tmp);
+  return strscpy(dst, tmp, size);
 }
 
 char *inet_ntop(int af, const void *src, char *dst, int size)
index 3a36deb..ee4789f 100644 (file)
@@ -382,7 +382,7 @@ int GetIntInfo(struct InterfaceInfo *Info, char *Name)
 
   Info->Broad = Info->Addr | ~Info->Mask;
 
-  strcpy(Info->Guid, Walker->AdapterName);
+  strscpy(Info->Guid, Walker->AdapterName, sizeof(Info->Guid));
 
   if ((IfTable->table[TabIdx].dwOperStatus != MIB_IF_OPER_STATUS_CONNECTED &&
       IfTable->table[TabIdx].dwOperStatus != MIB_IF_OPER_STATUS_OPERATIONAL) ||
@@ -422,7 +422,7 @@ static int IsWireless(char *IntName)
   DevName[2] = '.';
   DevName[3] = '\\';
 
-  strcpy(DevName + 4, Info.Guid);
+  strscpy(DevName + 4, Info.Guid, sizeof(DevName) - 4);
 
   OLSR_PRINTF(5, "Checking whether interface %s is wireless.\n", DevName);
 
@@ -591,6 +591,7 @@ int add_hemu_if(struct olsr_if *iface)
   union olsr_ip_addr null_addr;
   olsr_u32_t addr[4];
   struct ipaddr_str buf;
+  size_t name_size;
 
   if(!iface->host_emul)
     return -1;
@@ -602,11 +603,12 @@ int add_hemu_if(struct olsr_if *iface)
   iface->configured = OLSR_TRUE;
   iface->interf = ifp;
 
+  name_size = strlen("hcif01") + 1;
   ifp->is_hcif = OLSR_TRUE;
-  ifp->int_name = olsr_malloc(strlen("hcif01") + 1, "Interface update 3");
+  ifp->int_name = olsr_malloc(name_size, "Interface update 3");
   ifp->int_metric = 0;
 
-  strcpy(ifp->int_name, "hcif01");
+  strscpy(ifp->int_name, "hcif01", name_size);
 
   OLSR_PRINTF(1, "Adding %s(host emulation):\n", ifp->int_name);
 
@@ -897,6 +899,7 @@ int chk_if_up(struct olsr_if *IntConf, int DebugLevel __attribute__((unused)))
   union olsr_ip_addr NullAddr;
   int IsWlan;
   struct sockaddr_in *AddrIn;
+  size_t name_size;
   
   if (olsr_cnf->ip_version == AF_INET6)
   {
@@ -940,8 +943,9 @@ int chk_if_up(struct olsr_if *IntConf, int DebugLevel __attribute__((unused)))
 
   New->int_mtu = Info.Mtu;
 
-  New->int_name = olsr_malloc(strlen (IntConf->name) + 1, "Interface 2");
-  strcpy(New->int_name, IntConf->name);
+  name_size = strlen(IntConf->name) + 1;
+  New->int_name = olsr_malloc(name_size, "Interface 2");
+  strscpy(New->int_name, IntConf->name, name_size);
 
   IsWlan = IsWireless(IntConf->name);