From 48d08c2c9d3c82c752012f7e16558a5afdf22748 Mon Sep 17 00:00:00 2001 From: Christopher Ferris Date: Wed, 5 Apr 2017 12:09:17 -0700 Subject: [PATCH] Convert opens to use unique_fd. Fixes a potential leak of fds in WriteStringToFile. Test: I wrote a temporary test that failed the fchmod on host in Test: WriteStringToFile. I verified this fails with the old code after running Test: out of fds and passes with the new code. Change-Id: I168160841e35dd480d59a69bb4aa8176899fbb32 --- base/file.cpp | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) diff --git a/base/file.cpp b/base/file.cpp index d4e58942c..7fbebc538 100644 --- a/base/file.cpp +++ b/base/file.cpp @@ -28,8 +28,9 @@ #include #include -#include "android-base/macros.h" // For TEMP_FAILURE_RETRY on Darwin. #include "android-base/logging.h" +#include "android-base/macros.h" // For TEMP_FAILURE_RETRY on Darwin. +#include "android-base/unique_fd.h" #include "android-base/utf8.h" #include "utils/Compat.h" @@ -69,13 +70,11 @@ bool ReadFileToString(const std::string& path, std::string* content, bool follow content->clear(); int flags = O_RDONLY | O_CLOEXEC | O_BINARY | (follow_symlinks ? 0 : O_NOFOLLOW); - int fd = TEMP_FAILURE_RETRY(open(path.c_str(), flags)); + android::base::unique_fd fd(TEMP_FAILURE_RETRY(open(path.c_str(), flags))); if (fd == -1) { return false; } - bool result = ReadFdToString(fd, content); - close(fd); - return result; + return ReadFdToString(fd, content); } bool WriteStringToFd(const std::string& content, int fd) { @@ -106,7 +105,7 @@ bool WriteStringToFile(const std::string& content, const std::string& path, bool follow_symlinks) { int flags = O_WRONLY | O_CREAT | O_TRUNC | O_CLOEXEC | O_BINARY | (follow_symlinks ? 0 : O_NOFOLLOW); - int fd = TEMP_FAILURE_RETRY(open(path.c_str(), flags, mode)); + android::base::unique_fd fd(TEMP_FAILURE_RETRY(open(path.c_str(), flags, mode))); if (fd == -1) { PLOG(ERROR) << "android::WriteStringToFile open failed"; return false; @@ -126,7 +125,6 @@ bool WriteStringToFile(const std::string& content, const std::string& path, PLOG(ERROR) << "android::WriteStringToFile write failed"; return CleanUpAfterFailedWrite(path); } - close(fd); return true; } #endif @@ -135,14 +133,11 @@ bool WriteStringToFile(const std::string& content, const std::string& path, bool follow_symlinks) { int flags = O_WRONLY | O_CREAT | O_TRUNC | O_CLOEXEC | O_BINARY | (follow_symlinks ? 0 : O_NOFOLLOW); - int fd = TEMP_FAILURE_RETRY(open(path.c_str(), flags, DEFFILEMODE)); + android::base::unique_fd fd(TEMP_FAILURE_RETRY(open(path.c_str(), flags, DEFFILEMODE))); if (fd == -1) { return false; } - - bool result = WriteStringToFd(content, fd); - close(fd); - return result || CleanUpAfterFailedWrite(path); + return WriteStringToFd(content, fd) || CleanUpAfterFailedWrite(path); } bool ReadFully(int fd, void* data, size_t byte_count) {