Skip to content

Commit f9de11a

Browse files
Wang Weidongdavem330
Wang Weidong
authored andcommitted
bonding: add ip checks when store ip target
I met a Bug when I add ip target with the wrong ip address: echo +500.500.500.500 > /sys/class/net/bond0/bonding/arp_ip_target the wrong ip address will transfor to 245.245.245.244 and add to the ip target success, it is uncorrect, so I add checks to avoid adding wrong address. The in4_pton() will set wrong ip address to 0.0.0.0, it will return by the next check and will not add to ip target. v2 According Veaceslav's opinion, simplify the code. v3 According Veaceslav's opinion, add broadcast check and make a micro definition to package it. v4 Solve the problem of the format which David point out. Suggested-by: Veaceslav Falico <[email protected]> Suggested-by: David S. Miller <[email protected]> Signed-off-by: Ding Tianhong <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 1188f05 commit f9de11a

File tree

2 files changed

+9
-13
lines changed

2 files changed

+9
-13
lines changed

drivers/net/bonding/bond_sysfs.c

Lines changed: 6 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -604,15 +604,14 @@ static ssize_t bonding_store_arp_targets(struct device *d,
604604
return restart_syscall();
605605

606606
targets = bond->params.arp_targets;
607-
newtarget = in_aton(buf + 1);
607+
if (!in4_pton(buf + 1, -1, (u8 *)&newtarget, -1, NULL) ||
608+
IS_IP_TARGET_UNUSABLE_ADDRESS(newtarget)) {
609+
pr_err("%s: invalid ARP target %pI4 specified for addition\n",
610+
bond->dev->name, &newtarget);
611+
goto out;
612+
}
608613
/* look for adds */
609614
if (buf[0] == '+') {
610-
if ((newtarget == 0) || (newtarget == htonl(INADDR_BROADCAST))) {
611-
pr_err("%s: invalid ARP target %pI4 specified for addition\n",
612-
bond->dev->name, &newtarget);
613-
goto out;
614-
}
615-
616615
if (bond_get_targets_ip(targets, newtarget) != -1) { /* dup */
617616
pr_err("%s: ARP target %pI4 is already present\n",
618617
bond->dev->name, &newtarget);
@@ -635,12 +634,6 @@ static ssize_t bonding_store_arp_targets(struct device *d,
635634
targets[ind] = newtarget;
636635
write_unlock_bh(&bond->lock);
637636
} else if (buf[0] == '-') {
638-
if ((newtarget == 0) || (newtarget == htonl(INADDR_BROADCAST))) {
639-
pr_err("%s: invalid ARP target %pI4 specified for removal\n",
640-
bond->dev->name, &newtarget);
641-
goto out;
642-
}
643-
644637
ind = bond_get_targets_ip(targets, newtarget);
645638
if (ind == -1) {
646639
pr_err("%s: unable to remove nonexistent ARP target %pI4.\n",

drivers/net/bonding/bonding.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,9 @@
6363
(((mode) == BOND_MODE_TLB) || \
6464
((mode) == BOND_MODE_ALB))
6565

66+
#define IS_IP_TARGET_UNUSABLE_ADDRESS(a) \
67+
((htonl(INADDR_BROADCAST) == a) || \
68+
ipv4_is_zeronet(a))
6669
/*
6770
* Less bad way to call ioctl from within the kernel; this needs to be
6871
* done some other way to get the call out of interrupt context.

0 commit comments

Comments
 (0)