From 6da60ad25440c1e191e7e76c0e33d176ba98d5fb Mon Sep 17 00:00:00 2001 From: Vitaly Buka Date: Tue, 23 Feb 2016 12:07:07 -0800 Subject: Fix use-after-free detected by ASAN Change-Id: Iba1c55f7f32b74f1d3b4ce31bec092527f83e5c8 Reviewed-on: https://weave-review.googlesource.com/2712 Reviewed-by: Alex Vakulenko --- examples/provider/wifi_manager.cc | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) (limited to 'examples') diff --git a/examples/provider/wifi_manager.cc b/examples/provider/wifi_manager.cc index 7597e47..9337d23 100644 --- a/examples/provider/wifi_manager.cc +++ b/examples/provider/wifi_manager.cc @@ -46,20 +46,21 @@ int ForkCmdAndWait(const std::string& path, return status; } +struct DirCloser { + void operator()(DIR* dir) { closedir(dir); } +}; + std::string FindWirelessInterface() { std::string sysfs_net{"/sys/class/net"}; - DIR* net_dir = opendir(sysfs_net.c_str()); + std::unique_ptr net_dir{opendir(sysfs_net.c_str())}; + CHECK(net_dir); dirent* iface; - while ((iface = readdir(net_dir))) { + while ((iface = readdir(net_dir.get()))) { auto path = sysfs_net + "/" + iface->d_name + "/wireless"; - DIR* wireless_dir = opendir(path.c_str()); - if (wireless_dir != nullptr) { - closedir(net_dir); - closedir(wireless_dir); + std::unique_ptr wireless_dir{opendir(path.c_str())}; + if (wireless_dir) return iface->d_name; - } } - closedir(net_dir); return ""; } -- cgit v1.2.3