diff --git a/DEPS b/DEPS index c86b9c5b09..9bc9237a85 100644 --- a/DEPS +++ b/DEPS @@ -2675,6 +2675,7 @@ include_rules = [ "+absl/base/config.h", "+absl/base/const_init.h", "+absl/base/macros.h", + "+absl/cleanup/cleanup.h", "+absl/container/inlined_vector.h", "+absl/functional/bind_front.h", "+absl/memory/memory.h", diff --git a/g3doc/abseil-in-webrtc.md b/g3doc/abseil-in-webrtc.md index 9f7b4ab34f..6f0b4812e8 100644 --- a/g3doc/abseil-in-webrtc.md +++ b/g3doc/abseil-in-webrtc.md @@ -26,6 +26,7 @@ will generate a shared library. ## **Allowed** * `absl::bind_front` +* `absl::Cleanup` * `absl::InlinedVector` * `absl::WrapUnique` * `absl::optional` and related stuff from `absl/types/optional.h`. diff --git a/rtc_base/BUILD.gn b/rtc_base/BUILD.gn index 33d867aba7..0cac2a4f2b 100644 --- a/rtc_base/BUILD.gn +++ b/rtc_base/BUILD.gn @@ -285,7 +285,7 @@ rtc_library("rtc_event") { } config("chromium_logging_config") { - defines = ["LOGGING_INSIDE_WEBRTC"] + defines = [ "LOGGING_INSIDE_WEBRTC" ] } rtc_library("logging") { @@ -312,12 +312,13 @@ rtc_library("logging") { "../../webrtc_overrides/rtc_base/logging.cc", "../../webrtc_overrides/rtc_base/logging.h", ] + # This macro needs to be both present in all WebRTC targets (see its # definition in //BUILD.gn but also propagated to all the targets # depending on the Chromium component defined in # //third_party/webrtc_overrides:webrtc_component. This public_config # allows GN to propagate the macro accordingly. - public_configs = [":chromium_logging_config"] + public_configs = [ ":chromium_logging_config" ] } else { sources = [ "logging.cc", @@ -887,6 +888,7 @@ if (is_android) { "log", "GLESv2", ] + absl_deps = [ "//third_party/abseil-cpp/absl/cleanup" ] } } diff --git a/rtc_base/ifaddrs_android.cc b/rtc_base/ifaddrs_android.cc index 1cc63fe9f3..6474fb7244 100644 --- a/rtc_base/ifaddrs_android.cc +++ b/rtc_base/ifaddrs_android.cc @@ -24,6 +24,8 @@ #include #include +#include "absl/cleanup/cleanup.h" + namespace { struct netlinkrequest { @@ -138,10 +140,12 @@ int populate_ifaddrs(struct ifaddrs* ifaddr, } int getifaddrs(struct ifaddrs** result) { + *result = nullptr; int fd = socket(PF_NETLINK, SOCK_RAW, NETLINK_ROUTE); if (fd < 0) { return -1; } + absl::Cleanup close_file = [fd] { close(fd); }; netlinkrequest ifaddr_request; memset(&ifaddr_request, 0, sizeof(ifaddr_request)); @@ -151,10 +155,10 @@ int getifaddrs(struct ifaddrs** result) { ssize_t count = send(fd, &ifaddr_request, ifaddr_request.header.nlmsg_len, 0); if (static_cast(count) != ifaddr_request.header.nlmsg_len) { - close(fd); return -1; } struct ifaddrs* start = nullptr; + absl::Cleanup cleanup_start = [&start] { freeifaddrs(start); }; struct ifaddrs* current = nullptr; char buf[kMaxReadSize]; ssize_t amount_read = recv(fd, &buf, kMaxReadSize, 0); @@ -165,13 +169,12 @@ int getifaddrs(struct ifaddrs** result) { header = NLMSG_NEXT(header, header_size)) { switch (header->nlmsg_type) { case NLMSG_DONE: - // Success. Return. + // Success. Return `start`. Cancel `start` cleanup because it + // becomes callers responsibility. + std::move(cleanup_start).Cancel(); *result = start; - close(fd); return 0; case NLMSG_ERROR: - close(fd); - freeifaddrs(start); return -1; case RTM_NEWADDR: { ifaddrmsg* address_msg = @@ -192,8 +195,6 @@ int getifaddrs(struct ifaddrs** result) { } if (populate_ifaddrs(newest, address_msg, RTA_DATA(rta), RTA_PAYLOAD(rta)) != 0) { - freeifaddrs(start); - *result = nullptr; return -1; } current = newest; @@ -206,8 +207,6 @@ int getifaddrs(struct ifaddrs** result) { } amount_read = recv(fd, &buf, kMaxReadSize, 0); } - close(fd); - freeifaddrs(start); return -1; }