Use libbinderthreadstateutils.

Clients needing to differentiate between system/vendor used to be able
to use isServingCall. However, this was expensive to implement. This
alternative approach instead requires users of this API to use
libbinderthreadstateutils which does a slighty different operation.

Bug: 148692216
Test: atest VtsHalCameraServiceV2_0TargetTest
Test: running AImageReaderVendorTest
Test: try face unlock
Change-Id: I5615f4e8863487d0de8dad2d0529214750897036
gugelfrei
Steven Moreland 4 years ago
parent b5c0071bb7
commit 89a2c5ceef

@ -188,8 +188,8 @@ class VendorTagDescriptorCache : public Parcelable {
sp<android::VendorTagDescriptor> *desc /*out*/); sp<android::VendorTagDescriptor> *desc /*out*/);
// Parcelable interface // Parcelable interface
status_t writeToParcel(Parcel* parcel) const override; status_t writeToParcel(android::Parcel* parcel) const override;
status_t readFromParcel(const Parcel* parcel) override; status_t readFromParcel(const android::Parcel* parcel) override;
// Returns the number of vendor tags defined. // Returns the number of vendor tags defined.
int getTagCount(metadata_vendor_id_t id) const; int getTagCount(metadata_vendor_id_t id) const;

@ -129,6 +129,10 @@ cc_library_shared {
"android.hardware.camera.device@3.6" "android.hardware.camera.device@3.6"
], ],
static_libs: [
"libbinderthreadstateutils",
],
export_shared_lib_headers: [ export_shared_lib_headers: [
"libbinder", "libbinder",
"libcamera_client", "libcamera_client",

@ -43,6 +43,7 @@
#include <binder/PermissionController.h> #include <binder/PermissionController.h>
#include <binder/ProcessInfoService.h> #include <binder/ProcessInfoService.h>
#include <binder/IResultReceiver.h> #include <binder/IResultReceiver.h>
#include <binderthreadstate/CallerUtils.h>
#include <cutils/atomic.h> #include <cutils/atomic.h>
#include <cutils/properties.h> #include <cutils/properties.h>
#include <cutils/misc.h> #include <cutils/misc.h>
@ -1179,7 +1180,7 @@ Status CameraService::validateClientPermissionsLocked(const String8& cameraId,
// Only allow clients who are being used by the current foreground device user, unless calling // Only allow clients who are being used by the current foreground device user, unless calling
// from our own process OR the caller is using the cameraserver's HIDL interface. // from our own process OR the caller is using the cameraserver's HIDL interface.
if (!hardware::IPCThreadState::self()->isServingCall() && callingPid != getpid() && if (getCurrentServingCall() != BinderCallType::HWBINDER && callingPid != getpid() &&
(mAllowedUsers.find(clientUserId) == mAllowedUsers.end())) { (mAllowedUsers.find(clientUserId) == mAllowedUsers.end())) {
ALOGE("CameraService::connect X (PID %d) rejected (cannot connect from " ALOGE("CameraService::connect X (PID %d) rejected (cannot connect from "
"device user %d, currently allowed device users: %s)", callingPid, clientUserId, "device user %d, currently allowed device users: %s)", callingPid, clientUserId,
@ -1534,7 +1535,7 @@ bool CameraService::shouldRejectSystemCameraConnection(const String8& cameraId)
return false; return false;
} }
// (2) // (2)
if (!hardware::IPCThreadState::self()->isServingCall() && if (getCurrentServingCall() != BinderCallType::HWBINDER &&
systemCameraKind == SystemCameraKind::HIDDEN_SECURE_CAMERA) { systemCameraKind == SystemCameraKind::HIDDEN_SECURE_CAMERA) {
ALOGW("Rejecting access to secure hidden camera %s", cameraId.c_str()); ALOGW("Rejecting access to secure hidden camera %s", cameraId.c_str());
return true; return true;
@ -1543,7 +1544,7 @@ bool CameraService::shouldRejectSystemCameraConnection(const String8& cameraId)
// getCameraCharacteristics() allows for calls to succeed (albeit after hiding some // getCameraCharacteristics() allows for calls to succeed (albeit after hiding some
// characteristics) even if clients don't have android.permission.CAMERA. We do not want the // characteristics) even if clients don't have android.permission.CAMERA. We do not want the
// same behavior for system camera devices. // same behavior for system camera devices.
if (!hardware::IPCThreadState::self()->isServingCall() && if (getCurrentServingCall() != BinderCallType::HWBINDER &&
systemCameraKind == SystemCameraKind::SYSTEM_ONLY_CAMERA && systemCameraKind == SystemCameraKind::SYSTEM_ONLY_CAMERA &&
!hasPermissionsForSystemCamera(cPid, cUid)) { !hasPermissionsForSystemCamera(cPid, cUid)) {
ALOGW("Rejecting access to system only camera %s, inadequete permissions", ALOGW("Rejecting access to system only camera %s, inadequete permissions",
@ -1569,7 +1570,7 @@ Status CameraService::connectDevice(
sp<CameraDeviceClient> client = nullptr; sp<CameraDeviceClient> client = nullptr;
String16 clientPackageNameAdj = clientPackageName; String16 clientPackageNameAdj = clientPackageName;
if (hardware::IPCThreadState::self()->isServingCall()) { if (getCurrentServingCall() == BinderCallType::HWBINDER) {
std::string vendorClient = std::string vendorClient =
StringPrintf("vendor.client.pid<%d>", CameraThreadState::getCallingPid()); StringPrintf("vendor.client.pid<%d>", CameraThreadState::getCallingPid());
clientPackageNameAdj = String16(vendorClient.c_str()); clientPackageNameAdj = String16(vendorClient.c_str());
@ -2778,7 +2779,7 @@ CameraService::BasicClient::BasicClient(const sp<CameraService>& cameraService,
} }
mClientPackageName = packages[0]; mClientPackageName = packages[0];
} }
if (!hardware::IPCThreadState::self()->isServingCall()) { if (getCurrentServingCall() != BinderCallType::HWBINDER) {
mAppOpsManager = std::make_unique<AppOpsManager>(); mAppOpsManager = std::make_unique<AppOpsManager>();
} }
} }
@ -3450,7 +3451,7 @@ CameraService::DescriptorPtr CameraService::CameraClientManager::makeClientDescr
const std::set<String8>& conflictingKeys, int32_t score, int32_t ownerId, const std::set<String8>& conflictingKeys, int32_t score, int32_t ownerId,
int32_t state) { int32_t state) {
bool isVendorClient = hardware::IPCThreadState::self()->isServingCall(); bool isVendorClient = getCurrentServingCall() == BinderCallType::HWBINDER;
int32_t score_adj = isVendorClient ? kVendorClientScore : score; int32_t score_adj = isVendorClient ? kVendorClientScore : score;
int32_t state_adj = isVendorClient ? kVendorClientState: state; int32_t state_adj = isVendorClient ? kVendorClientState: state;

@ -17,33 +17,34 @@
#include "CameraThreadState.h" #include "CameraThreadState.h"
#include <binder/IPCThreadState.h> #include <binder/IPCThreadState.h>
#include <hwbinder/IPCThreadState.h> #include <hwbinder/IPCThreadState.h>
#include <binderthreadstate/CallerUtils.h>
#include <unistd.h> #include <unistd.h>
namespace android { namespace android {
int CameraThreadState::getCallingUid() { int CameraThreadState::getCallingUid() {
if (hardware::IPCThreadState::self()->isServingCall()) { if (getCurrentServingCall() == BinderCallType::HWBINDER) {
return hardware::IPCThreadState::self()->getCallingUid(); return hardware::IPCThreadState::self()->getCallingUid();
} }
return IPCThreadState::self()->getCallingUid(); return IPCThreadState::self()->getCallingUid();
} }
int CameraThreadState::getCallingPid() { int CameraThreadState::getCallingPid() {
if (hardware::IPCThreadState::self()->isServingCall()) { if (getCurrentServingCall() == BinderCallType::HWBINDER) {
return hardware::IPCThreadState::self()->getCallingPid(); return hardware::IPCThreadState::self()->getCallingPid();
} }
return IPCThreadState::self()->getCallingPid(); return IPCThreadState::self()->getCallingPid();
} }
int64_t CameraThreadState::clearCallingIdentity() { int64_t CameraThreadState::clearCallingIdentity() {
if (hardware::IPCThreadState::self()->isServingCall()) { if (getCurrentServingCall() == BinderCallType::HWBINDER) {
return hardware::IPCThreadState::self()->clearCallingIdentity(); return hardware::IPCThreadState::self()->clearCallingIdentity();
} }
return IPCThreadState::self()->clearCallingIdentity(); return IPCThreadState::self()->clearCallingIdentity();
} }
void CameraThreadState::restoreCallingIdentity(int64_t token) { void CameraThreadState::restoreCallingIdentity(int64_t token) {
if (hardware::IPCThreadState::self()->isServingCall()) { if (getCurrentServingCall() == BinderCallType::HWBINDER) {
hardware::IPCThreadState::self()->restoreCallingIdentity(token); hardware::IPCThreadState::self()->restoreCallingIdentity(token);
} else { } else {
IPCThreadState::self()->restoreCallingIdentity(token); IPCThreadState::self()->restoreCallingIdentity(token);

@ -35,7 +35,7 @@ class ClientPriority {
public: public:
/** /**
* Choosing to set mIsVendorClient through a parameter instead of calling * Choosing to set mIsVendorClient through a parameter instead of calling
* hardware::IPCThreadState::self()->isServingCall() to protect against the * getCurrentServingCall() == BinderCallType::HWBINDER to protect against the
* case where the construction is offloaded to another thread which isn't a * case where the construction is offloaded to another thread which isn't a
* hwbinder thread. * hwbinder thread.
*/ */
@ -237,7 +237,7 @@ void ClientDescriptor<KEY, VALUE>::setPriority(const ClientPriority& priority) {
// We don't use the usual copy constructor here since we want to remember // We don't use the usual copy constructor here since we want to remember
// whether a client is a vendor client or not. This could have been wiped // whether a client is a vendor client or not. This could have been wiped
// off in the incoming priority argument since an AIDL thread might have // off in the incoming priority argument since an AIDL thread might have
// called hardware::IPCThreadState::self()->isServingCall() after refreshing // called getCurrentServingCall() == BinderCallType::HWBINDER after refreshing
// priorities for old clients through ProcessInfoService::getProcessStatesScoresFromPids(). // priorities for old clients through ProcessInfoService::getProcessStatesScoresFromPids().
mPriority.setScore(priority.getScore()); mPriority.setScore(priority.getScore());
mPriority.setState(priority.getState()); mPriority.setState(priority.getState());

Loading…
Cancel
Save