bonding: add ip checks when store ip target
Subsystems (3)
PATCH v4 1/1 bonding: add ip checks when store ip target
Quoted 1 line
From
513509eecdee98d72668219aead9784d56dbad0fMon Sep 17 00:00:00 2001
From: Wang Weidong <[email protected]>
Date: Fri, 15 Nov 2013 10:34:30 -0500
Subject: [PATCH] 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.
--- drivers/net/bonding/bond_sysfs.c | 19 ++++++------------- drivers/net/bonding/bonding.h | 3 +++ 2 files changed, 9 insertions(+), 13 deletions(-)
drivers/net/bonding/bond_sysfs.c +6 -13
@@ -611,15 +611,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);
@@ -642,12 +641,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",
drivers/net/bonding/bonding.h +3 -0
@@ -63,6 +63,9 @@ (((mode) ==BOND_MODE_TLB ) || \ ((mode) == BOND_MODE_ALB)) +#define IS_IP_TARGET_UNUSABLE_ADDRESS (a) \ + ((htonl(INADDR_BROADCAST) == a) || \ + ipv4_is_zeronet(a))/* * Less bad way to call ioctl from within the kernel; this needs to be * done some other way to get the call out of interrupt context.
Signature · 1 line
1.7.12
From: Ding Tianhong <[email protected]>
Date: Fri, 15 Nov 2013 09:58:58 +0800
Quoted 23 lines
From
513509eecdee98d72668219aead9784d56dbad0fMon Sep 17 00:00:00 2001
From: Wang Weidong <[email protected]>
Date: Fri, 15 Nov 2013 10:34:30 -0500
Subject: [PATCH] bonding: add ip checks when store ip targetI 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_targetthe 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.
Quoted 6 lines
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]>
Applied, thanks.