Index: base/memory/shared_memory_posix.cc |
diff --git a/base/memory/shared_memory_posix.cc b/base/memory/shared_memory_posix.cc |
index 1a90847145b4d688bbd9cfd6ceac510c3da5c4fd..8780c040cc2de72492b5b4e1c1c93456fad1d793 100644 |
--- a/base/memory/shared_memory_posix.cc |
+++ b/base/memory/shared_memory_posix.cc |
@@ -30,6 +30,7 @@ |
#include "third_party/ashmem/ashmem.h" |
#endif |
+using file_util::ScopedFD; |
using file_util::ScopedFILE; |
namespace base { |
@@ -131,7 +132,8 @@ |
ScopedFILE fp; |
bool fix_size = true; |
- ScopedFD readonly_fd; |
+ int readonly_fd_storage = -1; |
+ ScopedFD readonly_fd(&readonly_fd_storage); |
FilePath path; |
if (options.name_deprecated == NULL || options.name_deprecated->empty()) { |
@@ -143,8 +145,8 @@ |
if (fp) { |
// Also open as readonly so that we can ShareReadOnlyToProcess. |
- readonly_fd.reset(HANDLE_EINTR(open(path.value().c_str(), O_RDONLY))); |
- if (!readonly_fd.is_valid()) { |
+ *readonly_fd = HANDLE_EINTR(open(path.value().c_str(), O_RDONLY)); |
+ if (*readonly_fd < 0) { |
DPLOG(ERROR) << "open(\"" << path.value() << "\", O_RDONLY) failed"; |
fp.reset(); |
} |
@@ -196,8 +198,8 @@ |
} |
// Also open as readonly so that we can ShareReadOnlyToProcess. |
- readonly_fd.reset(HANDLE_EINTR(open(path.value().c_str(), O_RDONLY))); |
- if (!readonly_fd.is_valid()) { |
+ *readonly_fd = HANDLE_EINTR(open(path.value().c_str(), O_RDONLY)); |
+ if (*readonly_fd < 0) { |
DPLOG(ERROR) << "open(\"" << path.value() << "\", O_RDONLY) failed"; |
close(fd); |
fd = -1; |
@@ -263,8 +265,10 @@ |
const char *mode = read_only ? "r" : "r+"; |
ScopedFILE fp(base::OpenFile(path, mode)); |
- ScopedFD readonly_fd(HANDLE_EINTR(open(path.value().c_str(), O_RDONLY))); |
- if (!readonly_fd.is_valid()) { |
+ int readonly_fd_storage = -1; |
+ ScopedFD readonly_fd(&readonly_fd_storage); |
+ *readonly_fd = HANDLE_EINTR(open(path.value().c_str(), O_RDONLY)); |
+ if (*readonly_fd < 0) { |
DPLOG(ERROR) << "open(\"" << path.value() << "\", O_RDONLY) failed"; |
} |
return PrepareMapFile(fp.Pass(), readonly_fd.Pass()); |
@@ -349,7 +353,7 @@ |
bool SharedMemory::PrepareMapFile(ScopedFILE fp, ScopedFD readonly_fd) { |
DCHECK_EQ(-1, mapped_file_); |
DCHECK_EQ(-1, readonly_mapped_file_); |
- if (fp == NULL || !readonly_fd.is_valid()) return false; |
+ if (fp == NULL || *readonly_fd < 0) return false; |
// This function theoretically can block on the disk, but realistically |
// the temporary files we create will just go into the buffer cache |
@@ -360,7 +364,7 @@ |
struct stat readonly_st = {}; |
if (fstat(fileno(fp.get()), &st)) |
NOTREACHED(); |
- if (fstat(readonly_fd.get(), &readonly_st)) |
+ if (fstat(*readonly_fd, &readonly_st)) |
NOTREACHED(); |
if (st.st_dev != readonly_st.st_dev || st.st_ino != readonly_st.st_ino) { |
LOG(ERROR) << "writable and read-only inodes don't match; bailing"; |
@@ -377,7 +381,7 @@ |
} |
} |
inode_ = st.st_ino; |
- readonly_mapped_file_ = readonly_fd.release(); |
+ readonly_mapped_file_ = *readonly_fd.release(); |
return true; |
} |