|
@@ -604,15 +604,14 @@ static ssize_t bonding_store_arp_targets(struct device *d,
|
|
|
return restart_syscall();
|
|
|
|
|
|
targets = bond->params.arp_targets;
|
|
|
- newtarget = in_aton(buf + 1);
|
|
|
+ if (!in4_pton(buf + 1, -1, (u8 *)&newtarget, -1, NULL) ||
|
|
|
+ IS_IP_TARGET_UNUSABLE_ADDRESS(newtarget)) {
|
|
|
+ pr_err("%s: invalid ARP target %pI4 specified for addition\n",
|
|
|
+ bond->dev->name, &newtarget);
|
|
|
+ goto out;
|
|
|
+ }
|
|
|
/* look for adds */
|
|
|
if (buf[0] == '+') {
|
|
|
- if ((newtarget == 0) || (newtarget == htonl(INADDR_BROADCAST))) {
|
|
|
- pr_err("%s: invalid ARP target %pI4 specified for addition\n",
|
|
|
- bond->dev->name, &newtarget);
|
|
|
- goto out;
|
|
|
- }
|
|
|
-
|
|
|
if (bond_get_targets_ip(targets, newtarget) != -1) { /* dup */
|
|
|
pr_err("%s: ARP target %pI4 is already present\n",
|
|
|
bond->dev->name, &newtarget);
|
|
@@ -635,12 +634,6 @@ static ssize_t bonding_store_arp_targets(struct device *d,
|
|
|
targets[ind] = newtarget;
|
|
|
write_unlock_bh(&bond->lock);
|
|
|
} else if (buf[0] == '-') {
|
|
|
- if ((newtarget == 0) || (newtarget == htonl(INADDR_BROADCAST))) {
|
|
|
- pr_err("%s: invalid ARP target %pI4 specified for removal\n",
|
|
|
- bond->dev->name, &newtarget);
|
|
|
- goto out;
|
|
|
- }
|
|
|
-
|
|
|
ind = bond_get_targets_ip(targets, newtarget);
|
|
|
if (ind == -1) {
|
|
|
pr_err("%s: unable to remove nonexistent ARP target %pI4.\n",
|