cameraserver: Wrap calls to IPCThreadState functions to factor in different transports.
Add a wrapper around calls to IPCThreadState to
account for the fact that remote HIDL calls may use binder function
implementations internally.Therefore, we need to know whether we are on
a binder / hwbinder thread and call the appropriate IPCThreadState /
hardware::IPCThreadState function internally.
Bug: 110364143
Test: GCA
Test: Third party app
Test: camera CTS (no new failures).
Change-Id: Ibad03fafd2ccc53a5352a6df45cf8f641bc7a3bf
Signed-off-by: Jayant Chowdhary <jchowdhary@google.com>
diff --git a/services/camera/libcameraservice/CameraService.cpp b/services/camera/libcameraservice/CameraService.cpp
index fbd80e6..e69ce1f 100644
--- a/services/camera/libcameraservice/CameraService.cpp
+++ b/services/camera/libcameraservice/CameraService.cpp
@@ -69,6 +69,7 @@
#include "api2/CameraDeviceClient.h"
#include "utils/CameraTraces.h"
#include "utils/TagMonitor.h"
+#include "utils/CameraThreadState.h"
namespace {
const char* kPermissionServiceName = "permission";
@@ -325,7 +326,7 @@
hardware::camera2::ICameraDeviceCallbacks::ERROR_CAMERA_DISCONNECTED,
CaptureResultExtras{});
// Ensure not in binder RPC so client disconnect PID checks work correctly
- LOG_ALWAYS_FATAL_IF(getCallingPid() != getpid(),
+ LOG_ALWAYS_FATAL_IF(CameraThreadState::getCallingPid() != getpid(),
"onDeviceStatusChanged must be called from the camera service process!");
clientToDisconnect->disconnect();
}
@@ -491,8 +492,8 @@
strerror(-res), res);
}
- int callingPid = getCallingPid();
- int callingUid = getCallingUid();
+ int callingPid = CameraThreadState::getCallingPid();
+ int callingUid = CameraThreadState::getCallingUid();
std::vector<int32_t> tagsRemoved;
// If it's not calling from cameraserver, check the permission.
if ((callingPid != getpid()) &&
@@ -522,14 +523,6 @@
return ret;
}
-int CameraService::getCallingPid() {
- return IPCThreadState::self()->getCallingPid();
-}
-
-int CameraService::getCallingUid() {
- return IPCThreadState::self()->getCallingUid();
-}
-
String8 CameraService::getFormattedCurrentTime() {
time_t now = time(nullptr);
char formattedTime[64];
@@ -754,7 +747,7 @@
}
Status CameraService::initializeShimMetadata(int cameraId) {
- int uid = getCallingUid();
+ int uid = CameraThreadState::getCallingUid();
String16 internalPackageName("cameraserver");
String8 id = String8::format("%d", cameraId);
@@ -803,9 +796,9 @@
}
}
- int64_t token = IPCThreadState::self()->clearCallingIdentity();
+ int64_t token = CameraThreadState::clearCallingIdentity();
ret = initializeShimMetadata(cameraId);
- IPCThreadState::self()->restoreCallingIdentity(token);
+ CameraThreadState::restoreCallingIdentity(token);
if (!ret.isOk()) {
// Error already logged by callee
return ret;
@@ -862,7 +855,7 @@
}
#endif // __BRILLO__
- int callingPid = getCallingPid();
+ int callingPid = CameraThreadState::getCallingPid();
if (!mInitialized) {
ALOGE("CameraService::connect X (PID %d) rejected (camera HAL module not loaded)",
@@ -896,8 +889,8 @@
Status CameraService::validateClientPermissionsLocked(const String8& cameraId,
const String8& clientName8, int& clientUid, int& clientPid,
/*out*/int& originalClientPid) const {
- int callingPid = getCallingPid();
- int callingUid = getCallingUid();
+ int callingPid = CameraThreadState::getCallingPid();
+ int callingUid = CameraThreadState::getCallingUid();
// Check if we can trust clientUid
if (clientUid == USE_CALLING_UID) {
@@ -966,7 +959,7 @@
status_t CameraService::checkIfDeviceIsUsable(const String8& cameraId) const {
auto cameraState = getCameraState(cameraId);
- int callingPid = getCallingPid();
+ int callingPid = CameraThreadState::getCallingPid();
if (cameraState == nullptr) {
ALOGE("CameraService::connect X (PID %d) rejected (invalid camera ID %s)", callingPid,
cameraId.string());
@@ -1170,7 +1163,7 @@
mServiceLock.unlock();
// Clear caller identity temporarily so client disconnect PID checks work correctly
- int64_t token = IPCThreadState::self()->clearCallingIdentity();
+ int64_t token = CameraThreadState::clearCallingIdentity();
// Destroy evicted clients
for (auto& i : evictedClients) {
@@ -1178,7 +1171,7 @@
i->getValue()->disconnect(); // Clients will remove themselves from the active client list
}
- IPCThreadState::self()->restoreCallingIdentity(token);
+ CameraThreadState::restoreCallingIdentity(token);
for (const auto& i : evictedClients) {
ALOGV("%s: Waiting for disconnect to complete for client for device %s (PID %" PRId32 ")",
@@ -1231,7 +1224,7 @@
/*shimUpdateOnly*/ false, /*out*/client);
if(!ret.isOk()) {
- logRejected(id, getCallingPid(), String8(clientPackageName),
+ logRejected(id, CameraThreadState::getCallingPid(), String8(clientPackageName),
ret.toString8());
return ret;
}
@@ -1258,7 +1251,7 @@
/*out*/client);
if(!ret.isOk()) {
- logRejected(id, getCallingPid(), String8(clientPackageName),
+ logRejected(id, CameraThreadState::getCallingPid(), String8(clientPackageName),
ret.toString8());
return ret;
}
@@ -1285,7 +1278,7 @@
clientUid, USE_CALLING_PID, API_2, /*shimUpdateOnly*/ false, /*out*/client);
if(!ret.isOk()) {
- logRejected(id, getCallingPid(), String8(clientPackageName),
+ logRejected(id, CameraThreadState::getCallingPid(), String8(clientPackageName),
ret.toString8());
return ret;
}
@@ -1466,7 +1459,7 @@
}
String8 id = String8(cameraId.string());
- int uid = getCallingUid();
+ int uid = CameraThreadState::getCallingUid();
// verify id is valid.
auto state = getCameraState(id);
@@ -1913,13 +1906,13 @@
mServiceLock.unlock();
// Clear caller identity temporarily so client disconnect PID checks work correctly
- int64_t token = IPCThreadState::self()->clearCallingIdentity();
+ int64_t token = CameraThreadState::clearCallingIdentity();
for (auto& i : evicted) {
i->disconnect();
}
- IPCThreadState::self()->restoreCallingIdentity(token);
+ CameraThreadState::restoreCallingIdentity(token);
// Reacquire mServiceLock
mServiceLock.lock();
@@ -1987,7 +1980,7 @@
status_t CameraService::onTransact(uint32_t code, const Parcel& data, Parcel* reply,
uint32_t flags) {
- const int pid = getCallingPid();
+ const int pid = CameraThreadState::getCallingPid();
const int selfPid = getpid();
// Permission checks
@@ -2022,7 +2015,7 @@
// permissions to notify the camera service about system events
if (!checkCallingPermission(
String16("android.permission.CAMERA_SEND_SYSTEM_EVENTS"))) {
- const int uid = getCallingUid();
+ const int uid = CameraThreadState::getCallingUid();
ALOGE("Permission Denial: cannot send updates to camera service about system"
" events from pid=%d, uid=%d", pid, uid);
return PERMISSION_DENIED;
@@ -2119,7 +2112,7 @@
servicePid),
mCameraId(api1CameraId)
{
- int callingPid = getCallingPid();
+ int callingPid = CameraThreadState::getCallingPid();
LOG1("Client::Client E (pid %d, id %d)", callingPid, mCameraId);
mRemoteCallback = cameraClient;
@@ -2228,7 +2221,7 @@
// No dumping of clients directly over Binder,
// must go through CameraService::dump
android_errorWriteWithInfoLog(SN_EVENT_LOG_ID, "26265403",
- IPCThreadState::self()->getCallingUid(), NULL, 0);
+ CameraThreadState::getCallingUid(), NULL, 0);
return OK;
}
@@ -2365,7 +2358,7 @@
// Reset the client PID to allow server-initiated disconnect,
// and to prevent further calls by client.
- mClientPid = getCallingPid();
+ mClientPid = CameraThreadState::getCallingPid();
CaptureResultExtras resultExtras; // a dummy result (invalid)
notifyError(hardware::camera2::ICameraDeviceCallbacks::ERROR_CAMERA_DISABLED, resultExtras);
disconnect();
@@ -2726,8 +2719,8 @@
if (checkCallingPermission(String16("android.permission.DUMP")) == false) {
dprintf(fd, "Permission Denial: can't dump CameraService from pid=%d, uid=%d\n",
- getCallingPid(),
- getCallingUid());
+ CameraThreadState::getCallingPid(),
+ CameraThreadState::getCallingUid());
return NO_ERROR;
}
bool locked = tryLock(mServiceLock);
@@ -2900,7 +2893,7 @@
* binder driver
*/
// PID here is approximate and can be wrong.
- logClientDied(getCallingPid(), String8("Binder died unexpectedly"));
+ logClientDied(CameraThreadState::getCallingPid(), String8("Binder died unexpectedly"));
// check torch client
handleTorchClientBinderDied(who);