]> git.proxmox.com Git - mirror_iproute2.git/commitdiff
Fix ip command to not crash when interface name is too long.
authorosdl.net!shemminger <osdl.net!shemminger>
Wed, 1 Sep 2004 17:15:45 +0000 (17:15 +0000)
committerosdl.net!shemminger <osdl.net!shemminger>
Wed, 1 Sep 2004 17:15:45 +0000 (17:15 +0000)
  always use strncpy(.., IFNAMSIZ)

(Logical change 1.79)

ChangeLog
ip/iplink.c
ip/iptunnel.c

index 37b75010fca5ae87c853ba8f944fd88edce465e9..43dbb1f9b7b4f09baac1b9bdd2a1574eef46d02d 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2004-09-01  Stephen Hemminger  <shemminger@osdl.org>
+
+       * Fix ip command to not crash when interface name is too long.
+         always use strncpy(.., IFNAMSIZ)
+
 2004-08-31  Stephen Hemminger  <shemminger@osdl.org>
 
        * Add gact documentation from jamal
index a4132fa542523e245c1f0c8a9851d257575c7646..520280ed8aafb8aec1dae8ee31fcc54202801329 100644 (file)
@@ -82,13 +82,13 @@ static int get_ctl_fd(void)
        return -1;
 }
 
-static int do_chflags(char *dev, __u32 flags, __u32 mask)
+static int do_chflags(const char *dev, __u32 flags, __u32 mask)
 {
        struct ifreq ifr;
        int fd;
        int err;
 
-       strcpy(ifr.ifr_name, dev);
+       strncpy(ifr.ifr_name, dev, IFNAMSIZ);
        fd = get_ctl_fd();
        if (fd < 0)
                return -1;
@@ -109,14 +109,14 @@ static int do_chflags(char *dev, __u32 flags, __u32 mask)
        return err;
 }
 
-static int do_changename(char *dev, char *newdev)
+static int do_changename(const char *dev, const char *newdev)
 {
        struct ifreq ifr;
        int fd;
        int err;
 
-       strcpy(ifr.ifr_name, dev);
-       strcpy(ifr.ifr_newname, newdev);
+       strncpy(ifr.ifr_name, dev, IFNAMSIZ);
+       strncpy(ifr.ifr_newname, newdev, IFNAMSIZ);
        fd = get_ctl_fd();
        if (fd < 0)
                return -1;
@@ -130,7 +130,7 @@ static int do_changename(char *dev, char *newdev)
        return err;
 }
 
-static int set_qlen(char *dev, int qlen)
+static int set_qlen(const char *dev, int qlen)
 {
        struct ifreq ifr;
        int s;
@@ -140,7 +140,7 @@ static int set_qlen(char *dev, int qlen)
                return -1;
 
        memset(&ifr, 0, sizeof(ifr));
-       strcpy(ifr.ifr_name, dev); 
+       strncpy(ifr.ifr_name, dev, IFNAMSIZ); 
        ifr.ifr_qlen = qlen; 
        if (ioctl(s, SIOCSIFTXQLEN, &ifr) < 0) {
                perror("SIOCSIFXQLEN");
@@ -152,7 +152,7 @@ static int set_qlen(char *dev, int qlen)
        return 0; 
 }
 
-static int set_mtu(char *dev, int mtu)
+static int set_mtu(const char *dev, int mtu)
 {
        struct ifreq ifr;
        int s;
@@ -162,7 +162,7 @@ static int set_mtu(char *dev, int mtu)
                return -1;
 
        memset(&ifr, 0, sizeof(ifr));
-       strcpy(ifr.ifr_name, dev); 
+       strncpy(ifr.ifr_name, dev, IFNAMSIZ); 
        ifr.ifr_mtu = mtu; 
        if (ioctl(s, SIOCSIFMTU, &ifr) < 0) {
                perror("SIOCSIFMTU");
@@ -174,7 +174,7 @@ static int set_mtu(char *dev, int mtu)
        return 0; 
 }
 
-static int get_address(char *dev, int *htype)
+static int get_address(const char *dev, int *htype)
 {
        struct ifreq ifr;
        struct sockaddr_ll me;
@@ -188,7 +188,7 @@ static int get_address(char *dev, int *htype)
        }
 
        memset(&ifr, 0, sizeof(ifr));
-       strcpy(ifr.ifr_name, dev);
+       strncpy(ifr.ifr_name, dev, IFNAMSIZ);
        if (ioctl(s, SIOCGIFINDEX, &ifr) < 0) {
                perror("SIOCGIFINDEX");
                close(s);
@@ -216,12 +216,12 @@ static int get_address(char *dev, int *htype)
        return me.sll_halen;
 }
 
-static int parse_address(char *dev, int hatype, int halen, char *lla, struct ifreq *ifr)
+static int parse_address(const char *dev, int hatype, int halen, char *lla, struct ifreq *ifr)
 {
        int alen;
 
        memset(ifr, 0, sizeof(*ifr));
-       strcpy(ifr->ifr_name, dev);
+       strncpy(ifr->ifr_name, dev, IFNAMSIZ);
        ifr->ifr_hwaddr.sa_family = hatype;
        alen = ll_addr_a2n(ifr->ifr_hwaddr.sa_data, 14, lla);
        if (alen < 0)
index 45b904bd61733e1cd322d79c75be6d567b3f1498..19971a444b35bd711313400d950a3255d7c0c99f 100644 (file)
@@ -52,13 +52,13 @@ static void usage(void)
        exit(-1);
 }
 
-static int do_ioctl_get_ifindex(char *dev)
+static int do_ioctl_get_ifindex(const char *dev)
 {
        struct ifreq ifr;
        int fd;
        int err;
 
-       strcpy(ifr.ifr_name, dev);
+       strncpy(ifr.ifr_name, dev, IFNAMSIZ);
        fd = socket(AF_INET, SOCK_DGRAM, 0);
        err = ioctl(fd, SIOCGIFINDEX, &ifr);
        if (err) {
@@ -69,13 +69,13 @@ static int do_ioctl_get_ifindex(char *dev)
        return ifr.ifr_ifindex;
 }
 
-static int do_ioctl_get_iftype(char *dev)
+static int do_ioctl_get_iftype(const char *dev)
 {
        struct ifreq ifr;
        int fd;
        int err;
 
-       strcpy(ifr.ifr_name, dev);
+       strncpy(ifr.ifr_name, dev, IFNAMSIZ);
        fd = socket(AF_INET, SOCK_DGRAM, 0);
        err = ioctl(fd, SIOCGIFHWADDR, &ifr);
        if (err) {
@@ -105,14 +105,13 @@ static char * do_ioctl_get_ifname(int idx)
 }
 
 
-
-static int do_get_ioctl(char *basedev, struct ip_tunnel_parm *p)
+static int do_get_ioctl(const char *basedev, struct ip_tunnel_parm *p)
 {
        struct ifreq ifr;
        int fd;
        int err;
 
-       strcpy(ifr.ifr_name, basedev);
+       strncpy(ifr.ifr_name, basedev, IFNAMSIZ);
        ifr.ifr_ifru.ifru_data = (void*)p;
        fd = socket(AF_INET, SOCK_DGRAM, 0);
        err = ioctl(fd, SIOCGETTUNNEL, &ifr);
@@ -122,16 +121,16 @@ static int do_get_ioctl(char *basedev, struct ip_tunnel_parm *p)
        return err;
 }
 
-static int do_add_ioctl(int cmd, char *basedev, struct ip_tunnel_parm *p)
+static int do_add_ioctl(int cmd, const char *basedev, struct ip_tunnel_parm *p)
 {
        struct ifreq ifr;
        int fd;
        int err;
 
        if (cmd == SIOCCHGTUNNEL && p->name[0])
-               strcpy(ifr.ifr_name, p->name);
+               strncpy(ifr.ifr_name, p->name, IFNAMSIZ);
        else
-               strcpy(ifr.ifr_name, basedev);
+               strncpy(ifr.ifr_name, basedev, IFNAMSIZ);
        ifr.ifr_ifru.ifru_data = (void*)p;
        fd = socket(AF_INET, SOCK_DGRAM, 0);
        err = ioctl(fd, cmd, &ifr);
@@ -141,16 +140,16 @@ static int do_add_ioctl(int cmd, char *basedev, struct ip_tunnel_parm *p)
        return err;
 }
 
-static int do_del_ioctl(char *basedev, struct ip_tunnel_parm *p)
+static int do_del_ioctl(const char *basedev, struct ip_tunnel_parm *p)
 {
        struct ifreq ifr;
        int fd;
        int err;
 
        if (p->name[0])
-               strcpy(ifr.ifr_name, p->name);
+               strncpy(ifr.ifr_name, p->name, IFNAMSIZ);
        else
-               strcpy(ifr.ifr_name, basedev);
+               strncpy(ifr.ifr_name, basedev, IFNAMSIZ);
        ifr.ifr_ifru.ifru_data = (void*)p;
        fd = socket(AF_INET, SOCK_DGRAM, 0);
        err = ioctl(fd, SIOCDELTUNNEL, &ifr);