diff mbox

[OpenWrt-Devel,netifd,16/16] device: Fix null pointer derefence if device is unset

Message ID 1454320590-20710-16-git-send-email-dedeckeh@gmail.com
State Accepted
Headers show

Commit Message

Hans Dedecker Feb. 1, 2016, 9:56 a.m. UTC
Fix null pointer deference in device_claim if device is unset in device_user
struct. Typically this is observed when the parent device is removed
from (mac)vlan device config followed by a network reload

Signed-off-by: Hans Dedecker <dedeckeh@gmail.com>
---
 device.c | 13 ++++++++++---
 1 file changed, 10 insertions(+), 3 deletions(-)
diff mbox

Patch

diff --git a/device.c b/device.c
index 3404fee..9344e1b 100644
--- a/device.c
+++ b/device.c
@@ -333,6 +333,9 @@  int device_claim(struct device_user *dep)
 	if (dep->claimed)
 		return 0;
 
+	if (!dev)
+		return -1;
+
 	dep->claimed = true;
 	D(DEVICE, "Claim %s %s, new active count: %d\n", dev->type->name, dev->ifname, dev->active + 1);
 	if (++dev->active != 1)
@@ -721,12 +724,16 @@  device_apply_config(struct device *dev, const struct device_type *type,
 			free(dev->config);
 			dev->config = config;
 			if (change == DEV_CONFIG_RESTART && dev->present) {
+				int ret = 0;
+
 				device_set_present(dev, false);
 				if (dev->active && !dev->external) {
-					dev->set_state(dev, false);
-					dev->set_state(dev, true);
+					ret = dev->set_state(dev, false);
+					if (!ret)
+						ret = dev->set_state(dev, true);
 				}
-				device_set_present(dev, true);
+				if (!ret)
+					device_set_present(dev, true);
 			}
 			break;
 		case DEV_CONFIG_NO_CHANGE: