| 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;
|
| }
|
|
|
|
|