| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 "mojo/edk/embedder/platform_channel_utils_posix.h" | 5 #include "mojo/edk/embedder/platform_channel_utils_posix.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 #include <sys/socket.h> | 8 #include <sys/socket.h> |
| 9 #include <unistd.h> | 9 #include <unistd.h> |
| 10 | 10 |
| (...skipping 229 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 240 platform_handles->push_back(PlatformHandle(fds[i])); | 240 platform_handles->push_back(PlatformHandle(fds[i])); |
| 241 DCHECK(platform_handles->back().is_valid()); | 241 DCHECK(platform_handles->back().is_valid()); |
| 242 } | 242 } |
| 243 } | 243 } |
| 244 } | 244 } |
| 245 | 245 |
| 246 return result; | 246 return result; |
| 247 } | 247 } |
| 248 | 248 |
| 249 bool ServerAcceptConnection(PlatformHandle server_handle, | 249 bool ServerAcceptConnection(PlatformHandle server_handle, |
| 250 ScopedPlatformHandle* connection_handle) { | 250 ScopedPlatformHandle* connection_handle, |
| 251 bool check_peer_user) { |
| 251 DCHECK(server_handle.is_valid()); | 252 DCHECK(server_handle.is_valid()); |
| 252 connection_handle->reset(); | 253 connection_handle->reset(); |
| 253 #if defined(OS_NACL) | 254 #if defined(OS_NACL) |
| 254 NOTREACHED(); | 255 NOTREACHED(); |
| 255 return false; | 256 return false; |
| 256 #else | 257 #else |
| 257 ScopedPlatformHandle accept_handle( | 258 ScopedPlatformHandle accept_handle( |
| 258 PlatformHandle(HANDLE_EINTR(accept(server_handle.handle, NULL, 0)))); | 259 PlatformHandle(HANDLE_EINTR(accept(server_handle.handle, NULL, 0)))); |
| 259 if (!accept_handle.is_valid()) | 260 if (!accept_handle.is_valid()) |
| 260 return IsRecoverableError(); | 261 return IsRecoverableError(); |
| 261 | 262 |
| 262 // Verify that the IPC channel peer is running as the same user. | 263 // Verify that the IPC channel peer is running as the same user. |
| 263 if (!IsPeerAuthorized(accept_handle.get())) { | 264 if (check_peer_user && !IsPeerAuthorized(accept_handle.get())) { |
| 264 return true; | 265 return true; |
| 265 } | 266 } |
| 266 | 267 |
| 267 if (!base::SetNonBlocking(accept_handle.get().handle)) { | 268 if (!base::SetNonBlocking(accept_handle.get().handle)) { |
| 268 PLOG(ERROR) << "base::SetNonBlocking() failed " | 269 PLOG(ERROR) << "base::SetNonBlocking() failed " |
| 269 << accept_handle.get().handle; | 270 << accept_handle.get().handle; |
| 270 // It's safe to keep listening on |server_handle| even if the attempt to set | 271 // It's safe to keep listening on |server_handle| even if the attempt to set |
| 271 // O_NONBLOCK failed on the client fd. | 272 // O_NONBLOCK failed on the client fd. |
| 272 return true; | 273 return true; |
| 273 } | 274 } |
| 274 | 275 |
| 275 *connection_handle = std::move(accept_handle); | 276 *connection_handle = std::move(accept_handle); |
| 276 return true; | 277 return true; |
| 277 #endif // defined(OS_NACL) | 278 #endif // defined(OS_NACL) |
| 278 } | 279 } |
| 279 | 280 |
| 280 } // namespace edk | 281 } // namespace edk |
| 281 } // namespace mojo | 282 } // namespace mojo |
| OLD | NEW |