aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenis Vlasenko <vda.linux@googlemail.com>2006-11-27 23:44:57 +0000
committerDenis Vlasenko <vda.linux@googlemail.com>2006-11-27 23:44:57 +0000
commit229b3d207216b23a107e4e1ee5584412f6b9318d (patch)
treed21a19b020f0ff35f7d0fa24f9812d68057ff06a
parente2d3ded3549edd58fe3b39f2254c65f0808bcac2 (diff)
downloadbusybox-w32-229b3d207216b23a107e4e1ee5584412f6b9318d.tar.gz
busybox-w32-229b3d207216b23a107e4e1ee5584412f6b9318d.tar.bz2
busybox-w32-229b3d207216b23a107e4e1ee5584412f6b9318d.zip
do not overflow ifr_name. maybe it was safe in some places,
but not everywhere. err to the safe side.
-rw-r--r--networking/ether-wake.c2
-rw-r--r--networking/interface.c20
-rw-r--r--networking/libiproute/ipaddress.c2
-rw-r--r--networking/libiproute/iplink.c14
-rw-r--r--networking/libiproute/iptunnel.c14
-rw-r--r--networking/route.c2
-rw-r--r--networking/udhcp/socket.c2
7 files changed, 28 insertions, 28 deletions
diff --git a/networking/ether-wake.c b/networking/ether-wake.c
index f870f6a5f..e205ffc00 100644
--- a/networking/ether-wake.c
+++ b/networking/ether-wake.c
@@ -145,7 +145,7 @@ int ether_wake_main(int argc, char *argv[])
145 { 145 {
146 struct ifreq if_hwaddr; 146 struct ifreq if_hwaddr;
147 147
148 strcpy(if_hwaddr.ifr_name, ifname); 148 strncpy(if_hwaddr.ifr_name, ifname, sizeof(if_hwaddr.ifr_name));
149 if (ioctl(s, SIOCGIFHWADDR, &if_hwaddr) < 0) 149 if (ioctl(s, SIOCGIFHWADDR, &if_hwaddr) < 0)
150 bb_perror_msg_and_die("SIOCGIFHWADDR on %s failed", ifname); 150 bb_perror_msg_and_die("SIOCGIFHWADDR on %s failed", ifname);
151 151
diff --git a/networking/interface.c b/networking/interface.c
index 5f54fd9e5..cabfc063b 100644
--- a/networking/interface.c
+++ b/networking/interface.c
@@ -617,12 +617,12 @@ static int if_fetch(struct interface *ife)
617 int fd; 617 int fd;
618 char *ifname = ife->name; 618 char *ifname = ife->name;
619 619
620 strcpy(ifr.ifr_name, ifname); 620 strncpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name));
621 if (ioctl(skfd, SIOCGIFFLAGS, &ifr) < 0) 621 if (ioctl(skfd, SIOCGIFFLAGS, &ifr) < 0)
622 return -1; 622 return -1;
623 ife->flags = ifr.ifr_flags; 623 ife->flags = ifr.ifr_flags;
624 624
625 strcpy(ifr.ifr_name, ifname); 625 strncpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name));
626 if (ioctl(skfd, SIOCGIFHWADDR, &ifr) < 0) 626 if (ioctl(skfd, SIOCGIFHWADDR, &ifr) < 0)
627 memset(ife->hwaddr, 0, 32); 627 memset(ife->hwaddr, 0, 32);
628 else 628 else
@@ -630,20 +630,20 @@ static int if_fetch(struct interface *ife)
630 630
631 ife->type = ifr.ifr_hwaddr.sa_family; 631 ife->type = ifr.ifr_hwaddr.sa_family;
632 632
633 strcpy(ifr.ifr_name, ifname); 633 strncpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name));
634 if (ioctl(skfd, SIOCGIFMETRIC, &ifr) < 0) 634 if (ioctl(skfd, SIOCGIFMETRIC, &ifr) < 0)
635 ife->metric = 0; 635 ife->metric = 0;
636 else 636 else
637 ife->metric = ifr.ifr_metric; 637 ife->metric = ifr.ifr_metric;
638 638
639 strcpy(ifr.ifr_name, ifname); 639 strncpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name));
640 if (ioctl(skfd, SIOCGIFMTU, &ifr) < 0) 640 if (ioctl(skfd, SIOCGIFMTU, &ifr) < 0)
641 ife->mtu = 0; 641 ife->mtu = 0;
642 else 642 else
643 ife->mtu = ifr.ifr_mtu; 643 ife->mtu = ifr.ifr_mtu;
644 644
645#ifdef SIOCGIFMAP 645#ifdef SIOCGIFMAP
646 strcpy(ifr.ifr_name, ifname); 646 strncpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name));
647 if (ioctl(skfd, SIOCGIFMAP, &ifr) == 0) 647 if (ioctl(skfd, SIOCGIFMAP, &ifr) == 0)
648 ife->map = ifr.ifr_map; 648 ife->map = ifr.ifr_map;
649 else 649 else
@@ -651,7 +651,7 @@ static int if_fetch(struct interface *ife)
651 memset(&ife->map, 0, sizeof(struct ifmap)); 651 memset(&ife->map, 0, sizeof(struct ifmap));
652 652
653#ifdef HAVE_TXQUEUELEN 653#ifdef HAVE_TXQUEUELEN
654 strcpy(ifr.ifr_name, ifname); 654 strncpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name));
655 if (ioctl(skfd, SIOCGIFTXQLEN, &ifr) < 0) 655 if (ioctl(skfd, SIOCGIFTXQLEN, &ifr) < 0)
656 ife->tx_queue_len = -1; /* unknown value */ 656 ife->tx_queue_len = -1; /* unknown value */
657 else 657 else
@@ -663,24 +663,24 @@ static int if_fetch(struct interface *ife)
663 /* IPv4 address? */ 663 /* IPv4 address? */
664 fd = get_socket_for_af(AF_INET); 664 fd = get_socket_for_af(AF_INET);
665 if (fd >= 0) { 665 if (fd >= 0) {
666 strcpy(ifr.ifr_name, ifname); 666 strncpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name));
667 ifr.ifr_addr.sa_family = AF_INET; 667 ifr.ifr_addr.sa_family = AF_INET;
668 if (ioctl(fd, SIOCGIFADDR, &ifr) == 0) { 668 if (ioctl(fd, SIOCGIFADDR, &ifr) == 0) {
669 ife->has_ip = 1; 669 ife->has_ip = 1;
670 ife->addr = ifr.ifr_addr; 670 ife->addr = ifr.ifr_addr;
671 strcpy(ifr.ifr_name, ifname); 671 strncpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name));
672 if (ioctl(fd, SIOCGIFDSTADDR, &ifr) < 0) 672 if (ioctl(fd, SIOCGIFDSTADDR, &ifr) < 0)
673 memset(&ife->dstaddr, 0, sizeof(struct sockaddr)); 673 memset(&ife->dstaddr, 0, sizeof(struct sockaddr));
674 else 674 else
675 ife->dstaddr = ifr.ifr_dstaddr; 675 ife->dstaddr = ifr.ifr_dstaddr;
676 676
677 strcpy(ifr.ifr_name, ifname); 677 strncpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name));
678 if (ioctl(fd, SIOCGIFBRDADDR, &ifr) < 0) 678 if (ioctl(fd, SIOCGIFBRDADDR, &ifr) < 0)
679 memset(&ife->broadaddr, 0, sizeof(struct sockaddr)); 679 memset(&ife->broadaddr, 0, sizeof(struct sockaddr));
680 else 680 else
681 ife->broadaddr = ifr.ifr_broadaddr; 681 ife->broadaddr = ifr.ifr_broadaddr;
682 682
683 strcpy(ifr.ifr_name, ifname); 683 strncpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name));
684 if (ioctl(fd, SIOCGIFNETMASK, &ifr) < 0) 684 if (ioctl(fd, SIOCGIFNETMASK, &ifr) < 0)
685 memset(&ife->netmask, 0, sizeof(struct sockaddr)); 685 memset(&ife->netmask, 0, sizeof(struct sockaddr));
686 else 686 else
diff --git a/networking/libiproute/ipaddress.c b/networking/libiproute/ipaddress.c
index 42cf629c6..2a267fef6 100644
--- a/networking/libiproute/ipaddress.c
+++ b/networking/libiproute/ipaddress.c
@@ -86,7 +86,7 @@ static void print_queuelen(char *name)
86 return; 86 return;
87 87
88 memset(&ifr, 0, sizeof(ifr)); 88 memset(&ifr, 0, sizeof(ifr));
89 strcpy(ifr.ifr_name, name); 89 strncpy(ifr.ifr_name, name, sizeof(ifr.ifr_name));
90 if (ioctl(s, SIOCGIFTXQLEN, &ifr) < 0) { 90 if (ioctl(s, SIOCGIFTXQLEN, &ifr) < 0) {
91 perror("SIOCGIFXQLEN"); 91 perror("SIOCGIFXQLEN");
92 close(s); 92 close(s);
diff --git a/networking/libiproute/iplink.c b/networking/libiproute/iplink.c
index f79dab402..1ea11f60b 100644
--- a/networking/libiproute/iplink.c
+++ b/networking/libiproute/iplink.c
@@ -61,7 +61,7 @@ static int do_chflags(char *dev, __u32 flags, __u32 mask)
61 int fd; 61 int fd;
62 int err; 62 int err;
63 63
64 strcpy(ifr.ifr_name, dev); 64 strncpy(ifr.ifr_name, dev, sizeof(ifr.ifr_name));
65 fd = get_ctl_fd(); 65 fd = get_ctl_fd();
66 if (fd < 0) 66 if (fd < 0)
67 return -1; 67 return -1;
@@ -88,8 +88,8 @@ static int do_changename(char *dev, char *newdev)
88 int fd; 88 int fd;
89 int err; 89 int err;
90 90
91 strcpy(ifr.ifr_name, dev); 91 strncpy(ifr.ifr_name, dev, sizeof(ifr.ifr_name));
92 strcpy(ifr.ifr_newname, newdev); 92 strncpy(ifr.ifr_newname, newdev, sizeof(ifr.ifr_newname));
93 fd = get_ctl_fd(); 93 fd = get_ctl_fd();
94 if (fd < 0) 94 if (fd < 0)
95 return -1; 95 return -1;
@@ -113,7 +113,7 @@ static int set_qlen(char *dev, int qlen)
113 return -1; 113 return -1;
114 114
115 memset(&ifr, 0, sizeof(ifr)); 115 memset(&ifr, 0, sizeof(ifr));
116 strcpy(ifr.ifr_name, dev); 116 strncpy(ifr.ifr_name, dev, sizeof(ifr.ifr_name));
117 ifr.ifr_qlen = qlen; 117 ifr.ifr_qlen = qlen;
118 if (ioctl(s, SIOCSIFTXQLEN, &ifr) < 0) { 118 if (ioctl(s, SIOCSIFTXQLEN, &ifr) < 0) {
119 perror("SIOCSIFXQLEN"); 119 perror("SIOCSIFXQLEN");
@@ -135,7 +135,7 @@ static int set_mtu(char *dev, int mtu)
135 return -1; 135 return -1;
136 136
137 memset(&ifr, 0, sizeof(ifr)); 137 memset(&ifr, 0, sizeof(ifr));
138 strcpy(ifr.ifr_name, dev); 138 strncpy(ifr.ifr_name, dev, sizeof(ifr.ifr_name));
139 ifr.ifr_mtu = mtu; 139 ifr.ifr_mtu = mtu;
140 if (ioctl(s, SIOCSIFMTU, &ifr) < 0) { 140 if (ioctl(s, SIOCSIFMTU, &ifr) < 0) {
141 perror("SIOCSIFMTU"); 141 perror("SIOCSIFMTU");
@@ -161,7 +161,7 @@ static int get_address(char *dev, int *htype)
161 } 161 }
162 162
163 memset(&ifr, 0, sizeof(ifr)); 163 memset(&ifr, 0, sizeof(ifr));
164 strcpy(ifr.ifr_name, dev); 164 strncpy(ifr.ifr_name, dev, sizeof(ifr.ifr_name));
165 if (ioctl(s, SIOCGIFINDEX, &ifr) < 0) { 165 if (ioctl(s, SIOCGIFINDEX, &ifr) < 0) {
166 perror("SIOCGIFINDEX"); 166 perror("SIOCGIFINDEX");
167 close(s); 167 close(s);
@@ -194,7 +194,7 @@ static int parse_address(char *dev, int hatype, int halen, char *lla, struct ifr
194 int alen; 194 int alen;
195 195
196 memset(ifr, 0, sizeof(*ifr)); 196 memset(ifr, 0, sizeof(*ifr));
197 strcpy(ifr->ifr_name, dev); 197 strncpy(ifr->ifr_name, dev, sizeof(ifr->ifr_name));
198 ifr->ifr_hwaddr.sa_family = hatype; 198 ifr->ifr_hwaddr.sa_family = hatype;
199 alen = ll_addr_a2n((unsigned char *)(ifr->ifr_hwaddr.sa_data), 14, lla); 199 alen = ll_addr_a2n((unsigned char *)(ifr->ifr_hwaddr.sa_data), 14, lla);
200 if (alen < 0) 200 if (alen < 0)
diff --git a/networking/libiproute/iptunnel.c b/networking/libiproute/iptunnel.c
index 2b9d3055e..2080324ac 100644
--- a/networking/libiproute/iptunnel.c
+++ b/networking/libiproute/iptunnel.c
@@ -42,7 +42,7 @@ static int do_ioctl_get_ifindex(char *dev)
42 struct ifreq ifr; 42 struct ifreq ifr;
43 int fd; 43 int fd;
44 44
45 strcpy(ifr.ifr_name, dev); 45 strncpy(ifr.ifr_name, dev, sizeof(ifr.ifr_name));
46 fd = xsocket(AF_INET, SOCK_DGRAM, 0); 46 fd = xsocket(AF_INET, SOCK_DGRAM, 0);
47 if (ioctl(fd, SIOCGIFINDEX, &ifr)) { 47 if (ioctl(fd, SIOCGIFINDEX, &ifr)) {
48 bb_perror_msg("ioctl"); 48 bb_perror_msg("ioctl");
@@ -57,7 +57,7 @@ static int do_ioctl_get_iftype(char *dev)
57 struct ifreq ifr; 57 struct ifreq ifr;
58 int fd; 58 int fd;
59 59
60 strcpy(ifr.ifr_name, dev); 60 strncpy(ifr.ifr_name, dev, sizeof(ifr.ifr_name));
61 fd = xsocket(AF_INET, SOCK_DGRAM, 0); 61 fd = xsocket(AF_INET, SOCK_DGRAM, 0);
62 if (ioctl(fd, SIOCGIFHWADDR, &ifr)) { 62 if (ioctl(fd, SIOCGIFHWADDR, &ifr)) {
63 bb_perror_msg("ioctl"); 63 bb_perror_msg("ioctl");
@@ -91,7 +91,7 @@ static int do_get_ioctl(char *basedev, struct ip_tunnel_parm *p)
91 int fd; 91 int fd;
92 int err; 92 int err;
93 93
94 strcpy(ifr.ifr_name, basedev); 94 strncpy(ifr.ifr_name, basedev, sizeof(ifr.ifr_name));
95 ifr.ifr_ifru.ifru_data = (void*)p; 95 ifr.ifr_ifru.ifru_data = (void*)p;
96 fd = xsocket(AF_INET, SOCK_DGRAM, 0); 96 fd = xsocket(AF_INET, SOCK_DGRAM, 0);
97 err = ioctl(fd, SIOCGETTUNNEL, &ifr); 97 err = ioctl(fd, SIOCGETTUNNEL, &ifr);
@@ -109,9 +109,9 @@ static int do_add_ioctl(int cmd, char *basedev, struct ip_tunnel_parm *p)
109 int err; 109 int err;
110 110
111 if (cmd == SIOCCHGTUNNEL && p->name[0]) { 111 if (cmd == SIOCCHGTUNNEL && p->name[0]) {
112 strcpy(ifr.ifr_name, p->name); 112 strncpy(ifr.ifr_name, p->name, sizeof(ifr.ifr_name));
113 } else { 113 } else {
114 strcpy(ifr.ifr_name, basedev); 114 strncpy(ifr.ifr_name, basedev, sizeof(ifr.ifr_name));
115 } 115 }
116 ifr.ifr_ifru.ifru_data = (void*)p; 116 ifr.ifr_ifru.ifru_data = (void*)p;
117 fd = xsocket(AF_INET, SOCK_DGRAM, 0); 117 fd = xsocket(AF_INET, SOCK_DGRAM, 0);
@@ -130,9 +130,9 @@ static int do_del_ioctl(char *basedev, struct ip_tunnel_parm *p)
130 int err; 130 int err;
131 131
132 if (p->name[0]) { 132 if (p->name[0]) {
133 strcpy(ifr.ifr_name, p->name); 133 strncpy(ifr.ifr_name, p->name, sizeof(ifr.ifr_name));
134 } else { 134 } else {
135 strcpy(ifr.ifr_name, basedev); 135 strncpy(ifr.ifr_name, basedev, sizeof(ifr.ifr_name));
136 } 136 }
137 ifr.ifr_ifru.ifru_data = (void*)p; 137 ifr.ifr_ifru.ifru_data = (void*)p;
138 fd = xsocket(AF_INET, SOCK_DGRAM, 0); 138 fd = xsocket(AF_INET, SOCK_DGRAM, 0);
diff --git a/networking/route.c b/networking/route.c
index f343d064c..a8926f44e 100644
--- a/networking/route.c
+++ b/networking/route.c
@@ -422,7 +422,7 @@ static void INET6_setroute(int action, char **args)
422 if (devname) { 422 if (devname) {
423 struct ifreq ifr; 423 struct ifreq ifr;
424 memset(&ifr, 0, sizeof(ifr)); 424 memset(&ifr, 0, sizeof(ifr));
425 strcpy(ifr.ifr_name, devname); 425 strncpy(ifr.ifr_name, devname, sizeof(ifr.ifr_name));
426 426
427 if (ioctl(skfd, SIOGIFINDEX, &ifr) < 0) { 427 if (ioctl(skfd, SIOGIFINDEX, &ifr) < 0) {
428 bb_perror_msg_and_die("SIOGIFINDEX"); 428 bb_perror_msg_and_die("SIOGIFINDEX");
diff --git a/networking/udhcp/socket.c b/networking/udhcp/socket.c
index b27dca300..92bf4cccf 100644
--- a/networking/udhcp/socket.c
+++ b/networking/udhcp/socket.c
@@ -51,7 +51,7 @@ int read_interface(char *interface, int *ifindex, uint32_t *addr, uint8_t *arp)
51 } 51 }
52 52
53 ifr.ifr_addr.sa_family = AF_INET; 53 ifr.ifr_addr.sa_family = AF_INET;
54 strcpy(ifr.ifr_name, interface); 54 strncpy(ifr.ifr_name, interface, sizeof(ifr.ifr_name));
55 if (addr) { 55 if (addr) {
56 if (ioctl(fd, SIOCGIFADDR, &ifr) == 0) { 56 if (ioctl(fd, SIOCGIFADDR, &ifr) == 0) {
57 bb_perror_msg("SIOCGIFADDR failed, is the interface up and configured?"); 57 bb_perror_msg("SIOCGIFADDR failed, is the interface up and configured?");