summaryrefslogtreecommitdiffstats
path: root/services
diff options
context:
space:
mode:
authorEino-Ville Talvala <etalvala@google.com>2012-10-10 13:07:01 -0700
committerAndroid Git Automerger <android-git-automerger@android.com>2012-10-10 13:07:01 -0700
commit3a8850848f4887105338e3e0e3bb2466fc445d2d (patch)
treed4d32324f652c8ff53e5a4472110d6baca8eb8f4 /services
parent03a5d4c13c1f9ddeff0b7035705a3db3135de757 (diff)
parente44d7f83a4d04b90417684d74f18ad8c703b981a (diff)
downloadframeworks_av-3a8850848f4887105338e3e0e3bb2466fc445d2d.zip
frameworks_av-3a8850848f4887105338e3e0e3bb2466fc445d2d.tar.gz
frameworks_av-3a8850848f4887105338e3e0e3bb2466fc445d2d.tar.bz2
am e44d7f83: am c0379204: Camera: Limit valid caller PIDs for camera clients.
* commit 'e44d7f83a4d04b90417684d74f18ad8c703b981a': Camera: Limit valid caller PIDs for camera clients.
Diffstat (limited to 'services')
-rw-r--r--services/camera/libcameraservice/Camera2Client.cpp24
-rw-r--r--services/camera/libcameraservice/CameraClient.cpp7
2 files changed, 11 insertions, 20 deletions
diff --git a/services/camera/libcameraservice/Camera2Client.cpp b/services/camera/libcameraservice/Camera2Client.cpp
index 7a6e344..cd9da42 100644
--- a/services/camera/libcameraservice/Camera2Client.cpp
+++ b/services/camera/libcameraservice/Camera2Client.cpp
@@ -65,10 +65,10 @@ Camera2Client::Camera2Client(const sp<CameraService>& cameraService,
status_t Camera2Client::checkPid(const char* checkLocation) const {
int callingPid = getCallingPid();
- if (callingPid == mClientPid || callingPid == mServicePid) return NO_ERROR;
+ if (callingPid == mClientPid) return NO_ERROR;
ALOGE("%s: attempt to use a locked camera from a different process"
- " (old pid %d, new pid %d, servicePid %d)", checkLocation, mClientPid, callingPid, mServicePid);
+ " (old pid %d, new pid %d)", checkLocation, mClientPid, callingPid);
return PERMISSION_DENIED;
}
@@ -139,19 +139,7 @@ Camera2Client::~Camera2Client() {
mDestructionStarted = true;
- Parameters::State state;
- // warning:
- // holding on to locks more than necessary may be hazardous to your health
- {
- SharedParameters::Lock l(mParameters);
- state = l.mParameters.state;
- }
-
- if (state != Parameters::DISCONNECTED) {
- // Rewrite mClientPid to allow shutdown by CameraService
- mClientPid = getCallingPid();
- disconnect();
- }
+ disconnect();
ALOGI("Camera %d: Closed", mCameraId);
}
@@ -372,7 +360,10 @@ void Camera2Client::disconnect() {
ATRACE_CALL();
Mutex::Autolock icl(mICameraLock);
status_t res;
- if ( (res = checkPid(__FUNCTION__) ) != OK) return;
+
+ // Allow both client and the media server to disconnect at all times
+ int callingPid = getCallingPid();
+ if (callingPid != mClientPid && callingPid != mServicePid) return;
if (mDevice == 0) return;
@@ -382,6 +373,7 @@ void Camera2Client::disconnect() {
{
SharedParameters::Lock l(mParameters);
+ if (l.mParameters.state == Parameters::DISCONNECTED) return;
l.mParameters.state = Parameters::DISCONNECTED;
}
diff --git a/services/camera/libcameraservice/CameraClient.cpp b/services/camera/libcameraservice/CameraClient.cpp
index 7e199fa..b930c02 100644
--- a/services/camera/libcameraservice/CameraClient.cpp
+++ b/services/camera/libcameraservice/CameraClient.cpp
@@ -102,8 +102,6 @@ CameraClient::~CameraClient() {
int callingPid = getCallingPid();
LOG1("CameraClient::~CameraClient E (pid %d, this %p)", callingPid, this);
- // set mClientPid to let disconnet() tear down the hardware
- mClientPid = callingPid;
disconnect();
LOG1("CameraClient::~CameraClient X (pid %d, this %p)", callingPid, this);
}
@@ -125,7 +123,7 @@ status_t CameraClient::dump(int fd, const Vector<String16>& args) {
status_t CameraClient::checkPid() const {
int callingPid = getCallingPid();
- if (callingPid == mClientPid || callingPid == mServicePid) return NO_ERROR;
+ if (callingPid == mClientPid) return NO_ERROR;
ALOGW("attempt to use a locked camera from a different process"
" (old pid %d, new pid %d)", mClientPid, callingPid);
@@ -219,7 +217,8 @@ void CameraClient::disconnect() {
LOG1("disconnect E (pid %d)", callingPid);
Mutex::Autolock lock(mLock);
- if (checkPid() != NO_ERROR) {
+ // Allow both client and the media server to disconnect at all times
+ if (callingPid != mClientPid && callingPid != mServicePid) {
ALOGW("different client - don't disconnect");
return;
}