Index: base/memory/shared_memory_mac.cc |
diff --git a/base/memory/shared_memory_mac.cc b/base/memory/shared_memory_mac.cc |
index ec74b0e5525411d476961807a7dfb132df2785e9..e7939b0192cf1382723b5e2cfae0da73347692cf 100644 |
--- a/base/memory/shared_memory_mac.cc |
+++ b/base/memory/shared_memory_mac.cc |
@@ -135,10 +135,15 @@ bool SharedMemory::GetSizeFromSharedMemoryHandle( |
// "name == L"". The exception is in the StatsTable. |
bool SharedMemory::Create(const SharedMemoryCreateOptions& options) { |
DCHECK(!shm_.IsValid()); |
- if (options.size == 0) return false; |
+ if (options.size == 0) { |
+ last_error_ = SharedMemoryError::BAD_PARAMS; |
+ return false; |
+ } |
- if (options.size > static_cast<size_t>(std::numeric_limits<int>::max())) |
+ if (options.size > static_cast<size_t>(std::numeric_limits<int>::max())) { |
+ last_error_ = SharedMemoryError::BAD_PARAMS; |
return false; |
+ } |
if (options.type == SharedMemoryHandle::MACH) { |
shm_ = SharedMemoryHandle(options.size, UnguessableToken::Create()); |
@@ -155,30 +160,31 @@ bool SharedMemory::Create(const SharedMemoryCreateOptions& options) { |
ScopedFD readonly_fd; |
FilePath path; |
- bool result = CreateAnonymousSharedMemory(options, &fp, &readonly_fd, &path); |
+ bool result = CreateAnonymousSharedMemory(options, &fp, &readonly_fd, &path, |
+ &last_error_); |
if (!result) |
return false; |
- |
- if (!fp) { |
- PLOG(ERROR) << "Creating shared memory in " << path.value() << " failed"; |
- return false; |
- } |
+ DCHECK(fp); // Should be guaranteed by CreateAnonymousSharedMemory(). |
// Get current size. |
struct stat stat; |
- if (fstat(fileno(fp.get()), &stat) != 0) |
+ if (fstat(fileno(fp.get()), &stat) != 0) { |
+ last_error_ = SharedMemoryError::STAT_FAILED; |
return false; |
+ } |
const size_t current_size = stat.st_size; |
if (current_size != options.size) { |
- if (HANDLE_EINTR(ftruncate(fileno(fp.get()), options.size)) != 0) |
+ if (HANDLE_EINTR(ftruncate(fileno(fp.get()), options.size)) != 0) { |
+ last_error_ = SharedMemoryError::TRUNCATE_FAILED; |
return false; |
+ } |
} |
requested_size_ = options.size; |
int mapped_file = -1; |
int readonly_mapped_file = -1; |
result = PrepareMapFile(std::move(fp), std::move(readonly_fd), &mapped_file, |
- &readonly_mapped_file); |
+ &readonly_mapped_file, &last_error_); |
shm_ = SharedMemoryHandle(FileDescriptor(mapped_file, false), |
UnguessableToken::Create()); |
readonly_shm_ = SharedMemoryHandle( |
@@ -187,12 +193,18 @@ bool SharedMemory::Create(const SharedMemoryCreateOptions& options) { |
} |
bool SharedMemory::MapAt(off_t offset, size_t bytes) { |
- if (!shm_.IsValid()) |
+ if (!shm_.IsValid()) { |
+ last_error_ = SharedMemoryError::BAD_PARAMS; |
return false; |
- if (bytes > static_cast<size_t>(std::numeric_limits<int>::max())) |
+ } |
+ if (bytes > static_cast<size_t>(std::numeric_limits<int>::max())) { |
+ last_error_ = SharedMemoryError::BAD_PARAMS; |
return false; |
- if (memory_) |
+ } |
+ if (memory_) { |
+ last_error_ = SharedMemoryError::BAD_PARAMS; |
return false; |
+ } |
bool success = shm_.MapAt(offset, bytes, &memory_, read_only_); |
if (success) { |
@@ -201,6 +213,7 @@ bool SharedMemory::MapAt(off_t offset, size_t bytes) { |
(SharedMemory::MAP_MINIMUM_ALIGNMENT - 1)); |
mapped_memory_mechanism_ = shm_.type_; |
} else { |
+ last_error_ = SharedMemoryError::MMAP_FAILED; |
memory_ = NULL; |
} |