[email protected] | 5c41e6e1 | 2012-03-17 02:20:46 | [diff] [blame] | 1 | // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 | // Use of this source code is governed by a BSD-style license that can be | ||||
3 | // found in the LICENSE file. | ||||
4 | |||||
5 | #include "ipc/ipc_channel.h" | ||||
6 | |||||
avi | 246998d8 | 2015-12-22 02:39:04 | [diff] [blame] | 7 | #include <stddef.h> |
tfarina | 10a5c06 | 2015-09-04 18:47:57 | [diff] [blame] | 8 | #include <stdint.h> |
9 | |||||
[email protected] | 5c41e6e1 | 2012-03-17 02:20:46 | [diff] [blame] | 10 | #include <limits> |
11 | |||||
12 | #include "base/atomic_sequence_num.h" | ||||
[email protected] | 5c41e6e1 | 2012-03-17 02:20:46 | [diff] [blame] | 13 | #include "base/rand_util.h" |
[email protected] | 4aa794a1 | 2013-06-11 06:32:18 | [diff] [blame] | 14 | #include "base/strings/stringprintf.h" |
avi | 246998d8 | 2015-12-22 02:39:04 | [diff] [blame] | 15 | #include "build/build_config.h" |
[email protected] | 5c41e6e1 | 2012-03-17 02:20:46 | [diff] [blame] | 16 | |
17 | namespace { | ||||
18 | |||||
19 | // Global atomic used to guarantee channel IDs are unique. | ||||
tzik | bc4270b | 2017-07-13 04:54:49 | [diff] [blame] | 20 | base::AtomicSequenceNumber g_last_id; |
[email protected] | 5c41e6e1 | 2012-03-17 02:20:46 | [diff] [blame] | 21 | |
22 | } // namespace | ||||
23 | |||||
24 | namespace IPC { | ||||
25 | |||||
26 | // static | ||||
Ken Rockot | 8b8c906 | 2017-09-18 19:36:21 | [diff] [blame] | 27 | constexpr size_t Channel::kMaximumMessageSize; |
28 | |||||
29 | // static | ||||
[email protected] | 5c41e6e1 | 2012-03-17 02:20:46 | [diff] [blame] | 30 | std::string Channel::GenerateUniqueRandomChannelID() { |
31 | // Note: the string must start with the current process id, this is how | ||||
32 | // some child processes determine the pid of the parent. | ||||
33 | // | ||||
34 | // This is composed of a unique incremental identifier, the process ID of | ||||
35 | // the creator, an identifier for the child instance, and a strong random | ||||
36 | // component. The strong random component prevents other processes from | ||||
37 | // hijacking or squatting on predictable channel names. | ||||
hidehiko | 763f8be | 2015-02-03 07:24:34 | [diff] [blame] | 38 | #if defined(OS_NACL_NONSFI) |
39 | // The seccomp sandbox disallows use of getpid(), so we provide a | ||||
40 | // dummy PID. | ||||
41 | int process_id = -1; | ||||
42 | #else | ||||
[email protected] | 21f9775 | 2012-06-16 00:35:01 | [diff] [blame] | 43 | int process_id = base::GetCurrentProcId(); |
hidehiko | 763f8be | 2015-02-03 07:24:34 | [diff] [blame] | 44 | #endif |
[email protected] | 5c41e6e1 | 2012-03-17 02:20:46 | [diff] [blame] | 45 | return base::StringPrintf("%d.%u.%d", |
[email protected] | fe5d406 | 2012-04-23 21:18:19 | [diff] [blame] | 46 | process_id, |
[email protected] | 5c41e6e1 | 2012-03-17 02:20:46 | [diff] [blame] | 47 | g_last_id.GetNext(), |
tfarina | 10a5c06 | 2015-09-04 18:47:57 | [diff] [blame] | 48 | base::RandInt(0, std::numeric_limits<int32_t>::max())); |
[email protected] | 5c41e6e1 | 2012-03-17 02:20:46 | [diff] [blame] | 49 | } |
50 | |||||
51 | } // namespace IPC |