OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "base/shared_memory.h" | 5 #include "base/shared_memory.h" |
6 | 6 |
7 #include <errno.h> | 7 #include <errno.h> |
8 #include <fcntl.h> | 8 #include <fcntl.h> |
9 #include <sys/mman.h> | 9 #include <sys/mman.h> |
10 #include <sys/stat.h> | 10 #include <sys/stat.h> |
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
135 fp = file_util::OpenFile(path, "w+x"); | 135 fp = file_util::OpenFile(path, "w+x"); |
136 if (fp == NULL && open_existing) { | 136 if (fp == NULL && open_existing) { |
137 // "w+" will truncate if it already exists. | 137 // "w+" will truncate if it already exists. |
138 fp = file_util::OpenFile(path, "a+"); | 138 fp = file_util::OpenFile(path, "a+"); |
139 fix_size = false; | 139 fix_size = false; |
140 } | 140 } |
141 } | 141 } |
142 if (fp && fix_size) { | 142 if (fp && fix_size) { |
143 // Get current size. | 143 // Get current size. |
144 struct stat stat; | 144 struct stat stat; |
145 if (fstat(fileno(fp), &stat) != 0) | 145 if (fstat(fileno(fp), &stat) != 0) { |
| 146 file_util::CloseFile(fp); |
146 return false; | 147 return false; |
| 148 } |
147 const uint32 current_size = stat.st_size; | 149 const uint32 current_size = stat.st_size; |
148 if (current_size != size) { | 150 if (current_size != size) { |
149 if (HANDLE_EINTR(ftruncate(fileno(fp), size)) != 0) | 151 if (HANDLE_EINTR(ftruncate(fileno(fp), size)) != 0) { |
| 152 file_util::CloseFile(fp); |
150 return false; | 153 return false; |
151 if (fseeko(fp, size, SEEK_SET) != 0) | 154 } |
| 155 if (fseeko(fp, size, SEEK_SET) != 0) { |
| 156 file_util::CloseFile(fp); |
152 return false; | 157 return false; |
| 158 } |
153 } | 159 } |
154 created_size_ = size; | 160 created_size_ = size; |
155 } | 161 } |
156 if (fp == NULL) { | 162 if (fp == NULL) { |
157 #if !defined(OS_MACOSX) | 163 #if !defined(OS_MACOSX) |
158 PLOG(ERROR) << "Creating shared memory in " << path.value() << " failed"; | 164 PLOG(ERROR) << "Creating shared memory in " << path.value() << " failed"; |
159 FilePath dir = path.DirName(); | 165 FilePath dir = path.DirName(); |
160 if (access(dir.value().c_str(), W_OK | X_OK) < 0) { | 166 if (access(dir.value().c_str(), W_OK | X_OK) < 0) { |
161 PLOG(ERROR) << "Unable to access(W_OK|X_OK) " << dir.value(); | 167 PLOG(ERROR) << "Unable to access(W_OK|X_OK) " << dir.value(); |
162 if (dir.value() == "/dev/shm") { | 168 if (dir.value() == "/dev/shm") { |
(...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
331 new_handle->fd = new_fd; | 337 new_handle->fd = new_fd; |
332 new_handle->auto_close = true; | 338 new_handle->auto_close = true; |
333 | 339 |
334 if (close_self) | 340 if (close_self) |
335 Close(); | 341 Close(); |
336 | 342 |
337 return true; | 343 return true; |
338 } | 344 } |
339 | 345 |
340 } // namespace base | 346 } // namespace base |
OLD | NEW |