From 991e5fae57752bc76a63027c5a8ac4a470e0f54f Mon Sep 17 00:00:00 2001 From: Ben Pfaff Date: Thu, 25 Jul 2013 17:05:46 -0700 Subject: [PATCH] netdev: Make netdev_from_name() take a reference to its returned netdev. This API change is necessary for thread safety, to be added in an upcoming commit. Otherwise, the client would not be able to safely use the returned netdev because it could already have been destroyed. Signed-off-by: Ben Pfaff Acked-by: Andy Zhou --- lib/netdev-linux.c | 1 + lib/netdev.c | 17 +++++++++++++---- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/lib/netdev-linux.c b/lib/netdev-linux.c index 5bbaf632f..c59f59090 100644 --- a/lib/netdev-linux.c +++ b/lib/netdev-linux.c @@ -541,6 +541,7 @@ netdev_linux_cache_cb(const struct rtnetlink_link_change *change, struct netdev *base_dev = netdev_from_name(change->ifname); if (base_dev && is_netdev_linux_class(netdev_get_class(base_dev))) { netdev_linux_update(netdev_linux_cast(base_dev), change); + netdev_close(base_dev); } } else { struct shash device_shash; diff --git a/lib/netdev.c b/lib/netdev.c index 25615380f..30c44a21f 100644 --- a/lib/netdev.c +++ b/lib/netdev.c @@ -1386,11 +1386,18 @@ netdev_get_class(const struct netdev *netdev) /* Returns the netdev with 'name' or NULL if there is none. * - * The caller must not free the returned value. */ + * The caller must free the returned netdev with netdev_close(). */ struct netdev * netdev_from_name(const char *name) { - return shash_find_data(&netdev_shash, name); + struct netdev *netdev; + + netdev = shash_find_data(&netdev_shash, name); + if (netdev) { + netdev_ref(netdev); + } + + return netdev; } /* Fills 'device_list' with devices that match 'netdev_class'. @@ -1415,8 +1422,10 @@ netdev_get_devices(const struct netdev_class *netdev_class, const char * netdev_get_type_from_name(const char *name) { - const struct netdev *dev = netdev_from_name(name); - return dev ? netdev_get_type(dev) : NULL; + struct netdev *dev = netdev_from_name(name); + const char *type = dev ? netdev_get_type(dev) : NULL; + netdev_close(dev); + return type; } void -- 2.43.0