blob: 5d04ebedae8dacc87e4c06f343527de78be38bde [file] [log] [blame]
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -08001/*
2 * Copyright (C) 2005 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
Steven Morelandc7a871e2020-11-10 21:56:57 +000017#pragma once
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -080018
19#include <utils/Errors.h>
Mathias Agopianc5b2c0b2009-05-19 19:08:10 -070020#include <binder/Parcel.h>
21#include <binder/ProcessState.h>
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -080022#include <utils/Vector.h>
23
Yabin Cui0dd549a2014-11-11 09:26:00 -080024#if defined(_WIN32)
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -080025typedef int uid_t;
26#endif
27
28// ---------------------------------------------------------------------------
29namespace android {
30
31class IPCThreadState
32{
33public:
Steven Moreland9514b202020-09-21 18:03:27 +000034 using CallRestriction = ProcessState::CallRestriction;
35
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -080036 static IPCThreadState* self();
Brad Fitzpatrick1b608432010-12-13 16:52:35 -080037 static IPCThreadState* selfOrNull(); // self(), but won't instantiate
Marco Ballesio7ee17572020-09-08 10:30:03 -070038
39 // Freeze or unfreeze the binder interface to a specific process. When freezing, this method
40 // will block up to timeout_ms to process pending transactions directed to pid. Unfreeze
41 // is immediate. Transactions to processes frozen via this method won't be delivered and the
42 // driver will return BR_FROZEN_REPLY to the client sending them. After unfreeze,
43 // transactions will be delivered normally.
44 //
45 // pid: id for the process for which the binder interface is to be frozen
46 // enable: freeze (true) or unfreeze (false)
47 // timeout_ms: maximum time this function is allowed to block the caller waiting for pending
48 // binder transactions to be processed.
49 //
50 // returns: 0 in case of success, a value < 0 in case of error
51 static status_t freeze(pid_t pid, bool enabled, uint32_t timeout_ms);
52
Marco Ballesiob09fc4a2020-09-11 16:17:21 -070053 // Provide information about the state of a frozen process
54 static status_t getProcessFreezeInfo(pid_t pid, bool *sync_received,
55 bool *async_received);
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -080056 sp<ProcessState> process();
57
58 status_t clearLastError();
59
Steven Moreland70012962020-03-12 17:32:26 -070060 /**
61 * Returns the PID of the process which has made the current binder
62 * call. If not in a binder call, this will return getpid. If the
63 * call is oneway, this will return 0.
64 */
Dan Stoza9c634fd2014-11-26 12:23:23 -080065 pid_t getCallingPid() const;
Steven Moreland70012962020-03-12 17:32:26 -070066
67 /**
68 * Returns the SELinux security identifier of the process which has
69 * made the current binder call. If not in a binder call this will
70 * return nullptr. If this isn't requested with
Steven Moreland2f405f52020-07-08 22:24:29 +000071 * Binder::setRequestingSid, it will also return nullptr.
Steven Moreland70012962020-03-12 17:32:26 -070072 *
73 * This can't be restored once it's cleared, and it does not return the
74 * context of the current process when not in a binder call.
75 */
Steven Morelandf0212002018-12-26 13:59:23 -080076 const char* getCallingSid() const;
Steven Moreland70012962020-03-12 17:32:26 -070077
78 /**
79 * Returns the UID of the process which has made the current binder
80 * call. If not in a binder call, this will return 0.
81 */
Dan Stoza9c634fd2014-11-26 12:23:23 -080082 uid_t getCallingUid() const;
Brad Fitzpatrick702ea9d2010-06-18 13:07:53 -070083
84 void setStrictModePolicy(int32_t policy);
85 int32_t getStrictModePolicy() const;
Brad Fitzpatrick52736032010-08-30 16:01:16 -070086
Olivier Gaillarda8e7bf22018-11-14 15:35:50 +000087 // See Binder#setCallingWorkSourceUid in Binder.java.
88 int64_t setCallingWorkSourceUid(uid_t uid);
Olivier Gaillard91a04802018-11-14 17:32:41 +000089 // Internal only. Use setCallingWorkSourceUid(uid) instead.
90 int64_t setCallingWorkSourceUidWithoutPropagation(uid_t uid);
Olivier Gaillarda8e7bf22018-11-14 15:35:50 +000091 // See Binder#getCallingWorkSourceUid in Binder.java.
92 uid_t getCallingWorkSourceUid() const;
93 // See Binder#clearCallingWorkSource in Binder.java.
94 int64_t clearCallingWorkSource();
95 // See Binder#restoreCallingWorkSource in Binder.java.
96 void restoreCallingWorkSource(int64_t token);
Olivier Gaillard91a04802018-11-14 17:32:41 +000097 void clearPropagateWorkSource();
98 bool shouldPropagateWorkSource() const;
Olivier Gaillard0e0f1de2018-08-16 14:04:09 +010099
Brad Fitzpatrick52736032010-08-30 16:01:16 -0700100 void setLastTransactionBinderFlags(int32_t flags);
101 int32_t getLastTransactionBinderFlags() const;
102
Steven Moreland9514b202020-09-21 18:03:27 +0000103 void setCallRestriction(CallRestriction restriction);
104 CallRestriction getCallRestriction() const;
105
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800106 int64_t clearCallingIdentity();
Steven Morelandf0212002018-12-26 13:59:23 -0800107 // Restores PID/UID (not SID)
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800108 void restoreCallingIdentity(int64_t token);
Steven Morelandd8c85672020-07-24 21:30:41 +0000109
110 status_t setupPolling(int* fd);
Todd Poynor8d96cab2013-06-25 19:12:18 -0700111 status_t handlePolledCommands();
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800112 void flushCommands();
Martijn Coenen0442a862017-11-17 10:46:32 +0100113 bool flushIfNeeded();
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800114
115 void joinThreadPool(bool isMain = true);
116
117 // Stop the local process.
118 void stopProcess(bool immediate = true);
119
120 status_t transact(int32_t handle,
121 uint32_t code, const Parcel& data,
122 Parcel* reply, uint32_t flags);
123
Martijn Coenen7c170bb2018-05-04 17:28:55 -0700124 void incStrongHandle(int32_t handle, BpBinder *proxy);
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800125 void decStrongHandle(int32_t handle);
Martijn Coenen7c170bb2018-05-04 17:28:55 -0700126 void incWeakHandle(int32_t handle, BpBinder *proxy);
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800127 void decWeakHandle(int32_t handle);
128 status_t attemptIncStrongHandle(int32_t handle);
129 static void expungeHandle(int32_t handle, IBinder* binder);
130 status_t requestDeathNotification( int32_t handle,
131 BpBinder* proxy);
132 status_t clearDeathNotification( int32_t handle,
133 BpBinder* proxy);
134
135 static void shutdown();
Wale Ogunwale376b8222015-04-13 16:16:10 -0700136
Dianne Hackborn8c6cedc2009-12-07 17:59:37 -0800137 // Call this to disable switching threads to background scheduling when
138 // receiving incoming IPC calls. This is specifically here for the
139 // Android system process, since it expects to have background apps calling
140 // in to it but doesn't want to acquire locks in its services while in
141 // the background.
142 static void disableBackgroundScheduling(bool disable);
Martijn Coenen2b631742017-05-05 11:16:59 -0700143 bool backgroundSchedulingDisabled();
Wale Ogunwale376b8222015-04-13 16:16:10 -0700144
145 // Call blocks until the number of executing binder threads is less than
146 // the maximum number of binder threads threads allowed for this process.
147 void blockUntilThreadAvailable();
148
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700149 // Service manager registration
Jiyong Park384328e2020-11-13 17:16:48 +0900150 void setTheContextObject(const sp<BBinder>& obj);
Jayant Chowdharydac6dc82018-10-01 22:52:44 +0000151
Steven Moreland39d887d2020-01-31 14:56:45 -0800152 // WARNING: DO NOT USE THIS API
Jayant Chowdharydac6dc82018-10-01 22:52:44 +0000153 //
Steven Moreland39d887d2020-01-31 14:56:45 -0800154 // Returns a pointer to the stack from the last time a transaction
155 // was initiated by the kernel. Used to compare when making nested
156 // calls between multiple different transports.
157 const void* getServingStackPointer() const;
Jayant Chowdharydac6dc82018-10-01 22:52:44 +0000158
Olivier Gaillard91a04802018-11-14 17:32:41 +0000159 // The work source represents the UID of the process we should attribute the transaction
Olivier Gaillard68c9eea2018-11-30 10:49:42 +0000160 // to. We use -1 to specify that the work source was not set using #setWorkSource.
161 //
162 // This constant needs to be kept in sync with Binder.UNSET_WORKSOURCE from the Java
163 // side.
Olivier Gaillard91a04802018-11-14 17:32:41 +0000164 static const int32_t kUnsetWorkSource = -1;
Jintao Zhu413a00e2021-01-16 17:42:00 +0800165
166 // Create a temp reference until commands in queue flushed to driver
167 // Internal only.
168 // @internal
169 void createTransactionReference(RefBase* ref);
170
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800171private:
172 IPCThreadState();
173 ~IPCThreadState();
174
Martijn Coenenea0090a2017-11-02 18:54:40 +0000175 status_t sendReply(const Parcel& reply, uint32_t flags);
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800176 status_t waitForResponse(Parcel *reply,
Yi Kong87d465c2018-07-24 01:14:06 -0700177 status_t *acquireResult=nullptr);
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800178 status_t talkWithDriver(bool doReceive=true);
179 status_t writeTransactionData(int32_t cmd,
180 uint32_t binderFlags,
181 int32_t handle,
182 uint32_t code,
183 const Parcel& data,
184 status_t* statusBuffer);
Todd Poynor8d96cab2013-06-25 19:12:18 -0700185 status_t getAndExecuteCommand();
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800186 status_t executeCommand(int32_t command);
Todd Poynor8d96cab2013-06-25 19:12:18 -0700187 void processPendingDerefs();
Martijn Coenen7c170bb2018-05-04 17:28:55 -0700188 void processPostWriteDerefs();
Wale Ogunwale376b8222015-04-13 16:16:10 -0700189
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800190 void clearCaller();
Wale Ogunwale376b8222015-04-13 16:16:10 -0700191
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800192 static void threadDestructor(void *st);
193 static void freeBuffer(Parcel* parcel,
194 const uint8_t* data, size_t dataSize,
Steven Moreland161fe122020-11-12 23:16:47 +0000195 const binder_size_t* objects, size_t objectsSize);
196
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800197 const sp<ProcessState> mProcess;
198 Vector<BBinder*> mPendingStrongDerefs;
199 Vector<RefBase::weakref_type*> mPendingWeakDerefs;
Martijn Coenen7c170bb2018-05-04 17:28:55 -0700200 Vector<RefBase*> mPostWriteStrongDerefs;
201 Vector<RefBase::weakref_type*> mPostWriteWeakDerefs;
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800202 Parcel mIn;
203 Parcel mOut;
204 status_t mLastError;
Steven Moreland39d887d2020-01-31 14:56:45 -0800205 const void* mServingStackPointer;
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800206 pid_t mCallingPid;
Steven Morelandf0212002018-12-26 13:59:23 -0800207 const char* mCallingSid;
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800208 uid_t mCallingUid;
Olivier Gaillard0e0f1de2018-08-16 14:04:09 +0100209 // The UID of the process who is responsible for this transaction.
210 // This is used for resource attribution.
211 int32_t mWorkSource;
Olivier Gaillard91a04802018-11-14 17:32:41 +0000212 // Whether the work source should be propagated.
213 bool mPropagateWorkSource;
Martijn Coenen0442a862017-11-17 10:46:32 +0100214 bool mIsLooper;
Frankie Chang617911d2021-05-18 13:08:05 +0800215 bool mIsFlushing;
Brad Fitzpatrick702ea9d2010-06-18 13:07:53 -0700216 int32_t mStrictModePolicy;
Brad Fitzpatrick52736032010-08-30 16:01:16 -0700217 int32_t mLastTransactionBinderFlags;
Steven Moreland9514b202020-09-21 18:03:27 +0000218 CallRestriction mCallRestriction;
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800219};
Brad Fitzpatrick702ea9d2010-06-18 13:07:53 -0700220
Steven Moreland61ff8492019-09-26 16:05:45 -0700221} // namespace android
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800222
223// ---------------------------------------------------------------------------