diff options
Diffstat (limited to 'services')
18 files changed, 145 insertions, 22 deletions
diff --git a/services/audiopolicy/managerdefault/AudioPolicyManager.cpp b/services/audiopolicy/managerdefault/AudioPolicyManager.cpp index ec1e982160..6425590893 100644 --- a/services/audiopolicy/managerdefault/AudioPolicyManager.cpp +++ b/services/audiopolicy/managerdefault/AudioPolicyManager.cpp @@ -5535,7 +5535,10 @@ uint32_t AudioPolicyManager::setOutputDevices(const sp<SwAudioOutputDescriptor>& patchBuilder.addSink(filteredDevice); } - installPatch(__func__, patchHandle, outputDesc.get(), patchBuilder.patch(), delayMs); + // Add half reported latency to delayMs when muteWaitMs is null in order + // to avoid disordered sequence of muting volume and changing devices. + installPatch(__func__, patchHandle, outputDesc.get(), patchBuilder.patch(), + muteWaitMs == 0 ? (delayMs + (outputDesc->latency() / 2)) : delayMs); } // update stream volumes according to new device diff --git a/services/audiopolicy/service/AudioPolicyInterfaceImpl.cpp b/services/audiopolicy/service/AudioPolicyInterfaceImpl.cpp index 5660d5e243..12984d0a12 100644 --- a/services/audiopolicy/service/AudioPolicyInterfaceImpl.cpp +++ b/services/audiopolicy/service/AudioPolicyInterfaceImpl.cpp @@ -997,11 +997,6 @@ status_t AudioPolicyService::setAllowedCapturePolicy(uid_t uid, audio_flags_mask ALOGV("%s() mAudioPolicyManager == NULL", __func__); return NO_INIT; } - uint_t callingUid = IPCThreadState::self()->getCallingUid(); - if (uid != callingUid) { - ALOGD("%s() uid invalid %d != %d", __func__, uid, callingUid); - return PERMISSION_DENIED; - } return mAudioPolicyManager->setAllowedCapturePolicy(uid, capturePolicy); } diff --git a/services/camera/libcameraservice/CameraService.cpp b/services/camera/libcameraservice/CameraService.cpp index 87deba2115..95e4e6eb74 100644 --- a/services/camera/libcameraservice/CameraService.cpp +++ b/services/camera/libcameraservice/CameraService.cpp @@ -121,6 +121,8 @@ static void setLogLevel(int level) { // ---------------------------------------------------------------------------- static const String16 sManageCameraPermission("android.permission.MANAGE_CAMERA"); +static const String16 sCameraOpenCloseListenerPermission( + "android.permission.CAMERA_OPEN_CLOSE_LISTENER"); // Matches with PERCEPTIBLE_APP_ADJ in ProcessList.java static constexpr int32_t kVendorClientScore = 200; @@ -1827,7 +1829,11 @@ Status CameraService::addListenerHelper(const sp<ICameraServiceListener>& listen } auto clientUid = CameraThreadState::getCallingUid(); - sp<ServiceListener> serviceListener = new ServiceListener(this, listener, clientUid); + auto clientPid = CameraThreadState::getCallingPid(); + bool openCloseCallbackAllowed = checkPermission(sCameraOpenCloseListenerPermission, + clientPid, clientUid); + sp<ServiceListener> serviceListener = new ServiceListener(this, listener, + clientUid, clientPid, openCloseCallbackAllowed); auto ret = serviceListener->initialize(); if (ret != NO_ERROR) { String8 msg = String8::format("Failed to initialize service listener: %s (%d)", @@ -2537,6 +2543,9 @@ status_t CameraService::BasicClient::startCameraOps() { sCameraService->mUidPolicy->registerMonitorUid(mClientUid); + // Notify listeners of camera open/close status + sCameraService->updateOpenCloseStatus(mCameraIdStr, true/*open*/, mClientPackageName); + return OK; } @@ -2577,6 +2586,9 @@ status_t CameraService::BasicClient::finishCameraOps() { sCameraService->mUidPolicy->unregisterMonitorUid(mClientUid); + // Notify listeners of camera open/close status + sCameraService->updateOpenCloseStatus(mCameraIdStr, false/*open*/, mClientPackageName); + return OK; } @@ -3352,6 +3364,29 @@ void CameraService::updateStatus(StatusInternal status, const String8& cameraId, }); } +void CameraService::updateOpenCloseStatus(const String8& cameraId, bool open, + const String16& clientPackageName) { + Mutex::Autolock lock(mStatusListenerLock); + + for (const auto& it : mListenerList) { + if (!it.second->isOpenCloseCallbackAllowed()) { + continue; + } + + binder::Status ret; + String16 cameraId64(cameraId); + if (open) { + ret = it.second->getListener()->onCameraOpened(cameraId64, clientPackageName); + } else { + ret = it.second->getListener()->onCameraClosed(cameraId64); + } + if (!ret.isOk()) { + ALOGE("%s: Failed to trigger onCameraOpened/onCameraClosed callback: %d", __FUNCTION__, + ret.exceptionCode()); + } + } +} + template<class Func> void CameraService::CameraState::updateStatus(StatusInternal status, const String8& cameraId, diff --git a/services/camera/libcameraservice/CameraService.h b/services/camera/libcameraservice/CameraService.h index 22842a1cc3..bcaca9ffcb 100644 --- a/services/camera/libcameraservice/CameraService.h +++ b/services/camera/libcameraservice/CameraService.h @@ -817,7 +817,9 @@ private: class ServiceListener : public virtual IBinder::DeathRecipient { public: ServiceListener(sp<CameraService> parent, sp<hardware::ICameraServiceListener> listener, - int uid) : mParent(parent), mListener(listener), mListenerUid(uid) {} + int uid, int pid, bool openCloseCallbackAllowed) : mParent(parent), + mListener(listener), mListenerUid(uid), mListenerPid(pid), + mOpenCloseCallbackAllowed(openCloseCallbackAllowed) {} status_t initialize() { return IInterface::asBinder(mListener)->linkToDeath(this); @@ -831,12 +833,16 @@ private: } int getListenerUid() { return mListenerUid; } + int getListenerPid() { return mListenerPid; } sp<hardware::ICameraServiceListener> getListener() { return mListener; } + bool isOpenCloseCallbackAllowed() { return mOpenCloseCallbackAllowed; } private: wp<CameraService> mParent; sp<hardware::ICameraServiceListener> mListener; int mListenerUid; + int mListenerPid; + bool mOpenCloseCallbackAllowed = false; }; // Guarded by mStatusListenerMutex @@ -859,6 +865,13 @@ private: void updateStatus(StatusInternal status, const String8& cameraId); + /** + * Update the opened/closed status of the given camera id. + * + * This method acqiures mStatusListenerLock. + */ + void updateOpenCloseStatus(const String8& cameraId, bool open, const String16& packageName); + // flashlight control sp<CameraFlashlight> mFlashlight; // guard mTorchStatusMap diff --git a/services/camera/libcameraservice/device3/Camera3Device.cpp b/services/camera/libcameraservice/device3/Camera3Device.cpp index 4227a3b9de..93e18cfee3 100644 --- a/services/camera/libcameraservice/device3/Camera3Device.cpp +++ b/services/camera/libcameraservice/device3/Camera3Device.cpp @@ -3529,6 +3529,8 @@ void Camera3Device::sendCaptureResult(CameraMetadata &pendingMetadata, frameNumber); return; } + nsecs_t sensorTimestamp = timestamp.data.i64[0]; + for (auto& physicalMetadata : captureResult.mPhysicalMetadatas) { camera_metadata_entry timestamp = physicalMetadata.mPhysicalCameraMetadata.find(ANDROID_SENSOR_TIMESTAMP); @@ -3583,7 +3585,7 @@ void Camera3Device::sendCaptureResult(CameraMetadata &pendingMetadata, CameraMetadata(m.mPhysicalCameraMetadata)); } mTagMonitor.monitorMetadata(TagMonitor::RESULT, - frameNumber, timestamp.data.i64[0], captureResult.mMetadata, + frameNumber, sensorTimestamp, captureResult.mMetadata, monitoredPhysicalMetadata); insertResultLocked(&captureResult, frameNumber); diff --git a/services/camera/libcameraservice/hidl/AidlCameraServiceListener.h b/services/camera/libcameraservice/hidl/AidlCameraServiceListener.h index 0f6be79be0..b9e58574c6 100644 --- a/services/camera/libcameraservice/hidl/AidlCameraServiceListener.h +++ b/services/camera/libcameraservice/hidl/AidlCameraServiceListener.h @@ -54,6 +54,15 @@ struct H2BCameraServiceListener : // TODO: no implementation yet. return binder::Status::ok(); } + virtual binder::Status onCameraOpened(const ::android::String16& /*cameraId*/, + const ::android::String16& /*clientPackageId*/) { + // empty implementation + return binder::Status::ok(); + } + virtual binder::Status onCameraClosed(const ::android::String16& /*cameraId*/) { + // empty implementation + return binder::Status::ok(); + } }; } // implementation diff --git a/services/mediacodec/Android.bp b/services/mediacodec/Android.bp index 99a6d6b807..2f3cad9737 100644 --- a/services/mediacodec/Android.bp +++ b/services/mediacodec/Android.bp @@ -64,5 +64,8 @@ prebuilt_etc { src: "seccomp_policy/mediacodec-x86.policy", }, }, - required: ["crash_dump.policy"], + required: [ + "crash_dump.policy", + "code_coverage.policy", + ], } diff --git a/services/mediacodec/Android.mk b/services/mediacodec/Android.mk index ecc84087b3..15bc5035b6 100644 --- a/services/mediacodec/Android.mk +++ b/services/mediacodec/Android.mk @@ -72,7 +72,7 @@ include $(CLEAR_VARS) LOCAL_MODULE := mediacodec.policy LOCAL_MODULE_CLASS := ETC LOCAL_MODULE_PATH := $(TARGET_OUT)/etc/seccomp_policy -LOCAL_REQUIRED_MODULES := crash_dump.policy +LOCAL_REQUIRED_MODULES := crash_dump.policy code_coverage.policy # mediacodec runs in 32-bit combatibility mode. For 64 bit architectures, # use the 32 bit policy ifdef TARGET_2ND_ARCH diff --git a/services/mediacodec/seccomp_policy/mediacodec-arm.policy b/services/mediacodec/seccomp_policy/mediacodec-arm.policy index 3870a11680..835f8bbec6 100644 --- a/services/mediacodec/seccomp_policy/mediacodec-arm.policy +++ b/services/mediacodec/seccomp_policy/mediacodec-arm.policy @@ -59,3 +59,5 @@ getdents64: 1 getrandom: 1 @include /system/etc/seccomp_policy/crash_dump.arm.policy + +@include /system/etc/seccomp_policy/code_coverage.arm.policy diff --git a/services/mediacodec/seccomp_policy/mediacodec-x86.policy b/services/mediacodec/seccomp_policy/mediacodec-x86.policy index d9c4045f82..a9d32d611e 100644 --- a/services/mediacodec/seccomp_policy/mediacodec-x86.policy +++ b/services/mediacodec/seccomp_policy/mediacodec-x86.policy @@ -69,3 +69,4 @@ getpid: 1 gettid: 1 @include /system/etc/seccomp_policy/crash_dump.x86.policy +@include /system/etc/seccomp_policy/code_coverage.x86.policy diff --git a/services/mediacodec/seccomp_policy/mediaswcodec-arm.policy b/services/mediacodec/seccomp_policy/mediaswcodec-arm.policy index 9042cd77b2..93b485243f 100644 --- a/services/mediacodec/seccomp_policy/mediaswcodec-arm.policy +++ b/services/mediacodec/seccomp_policy/mediaswcodec-arm.policy @@ -84,3 +84,5 @@ geteuid32: 1 getgid32: 1 getegid32: 1 getgroups32: 1 + +@include /system/etc/seccomp_policy/code_coverage.arm.policy diff --git a/services/mediacodec/seccomp_policy/mediaswcodec-arm64.policy b/services/mediacodec/seccomp_policy/mediaswcodec-arm64.policy index 4faf8b20c1..bb05770839 100644 --- a/services/mediacodec/seccomp_policy/mediaswcodec-arm64.policy +++ b/services/mediacodec/seccomp_policy/mediaswcodec-arm64.policy @@ -79,3 +79,4 @@ getgid: 1 getegid: 1 getgroups: 1 +@include /system/etc/seccomp_policy/code_coverage.arm64.policy diff --git a/services/mediaextractor/Android.bp b/services/mediaextractor/Android.bp index b812244170..0c701d7b80 100644 --- a/services/mediaextractor/Android.bp +++ b/services/mediaextractor/Android.bp @@ -66,6 +66,9 @@ prebuilt_etc { src: "seccomp_policy/mediaextractor-x86_64.policy", }, }, - required: ["crash_dump.policy"], + required: [ + "crash_dump.policy", + "code_coverage.policy", + ], } diff --git a/services/mediaextractor/seccomp_policy/mediaextractor-arm.policy b/services/mediaextractor/seccomp_policy/mediaextractor-arm.policy index 964acf421b..118072ec65 100644 --- a/services/mediaextractor/seccomp_policy/mediaextractor-arm.policy +++ b/services/mediaextractor/seccomp_policy/mediaextractor-arm.policy @@ -41,6 +41,9 @@ getegid32: 1 getgroups32: 1 nanosleep: 1 getrandom: 1 +timer_create: 1 +timer_settime: 1 +timer_delete: 1 # for dynamically loading extractors pread64: 1 @@ -50,3 +53,4 @@ readlinkat: 1 _llseek: 1 @include /system/etc/seccomp_policy/crash_dump.arm.policy +@include /system/etc/seccomp_policy/code_coverage.arm.policy diff --git a/services/mediaextractor/seccomp_policy/mediaextractor-arm64.policy b/services/mediaextractor/seccomp_policy/mediaextractor-arm64.policy index e6c676c5dd..481e29e253 100644 --- a/services/mediaextractor/seccomp_policy/mediaextractor-arm64.policy +++ b/services/mediaextractor/seccomp_policy/mediaextractor-arm64.policy @@ -30,6 +30,9 @@ rt_sigreturn: 1 getrlimit: 1 nanosleep: 1 getrandom: 1 +timer_create: 1 +timer_settime: 1 +timer_delete: 1 # for FileSource readlinkat: 1 @@ -44,3 +47,4 @@ mremap: 1 sched_yield: 1 @include /system/etc/seccomp_policy/crash_dump.arm64.policy +@include /system/etc/seccomp_policy/code_coverage.arm64.policy diff --git a/services/mediaextractor/seccomp_policy/mediaextractor-x86.policy b/services/mediaextractor/seccomp_policy/mediaextractor-x86.policy index 56ad8dfbe8..15fb24e5ea 100644 --- a/services/mediaextractor/seccomp_policy/mediaextractor-x86.policy +++ b/services/mediaextractor/seccomp_policy/mediaextractor-x86.policy @@ -39,6 +39,9 @@ getegid32: 1 getgroups32: 1 nanosleep: 1 getrandom: 1 +timer_create: 1 +timer_settime: 1 +timer_delete: 1 # for dynamically loading extractors getdents64: 1 @@ -57,3 +60,4 @@ getpid: 1 gettid: 1 @include /system/etc/seccomp_policy/crash_dump.x86.policy +@include /system/etc/seccomp_policy/code_coverage.x86.policy diff --git a/services/mediaextractor/seccomp_policy/mediaextractor-x86_64.policy b/services/mediaextractor/seccomp_policy/mediaextractor-x86_64.policy index 607a03ef04..4f2646c9cd 100644 --- a/services/mediaextractor/seccomp_policy/mediaextractor-x86_64.policy +++ b/services/mediaextractor/seccomp_policy/mediaextractor-x86_64.policy @@ -34,6 +34,9 @@ sched_setscheduler: 1 getrlimit: 1 nanosleep: 1 getrandom: 1 +timer_create: 1 +timer_settime: 1 +timer_delete: 1 # for dynamically loading extractors getdents64: 1 @@ -51,3 +54,4 @@ getpid: 1 gettid: 1 @include /system/etc/seccomp_policy/crash_dump.x86_64.policy +@include /system/etc/seccomp_policy/code_coverage.x86_64.policy diff --git a/services/soundtrigger/SoundTriggerHwService.cpp b/services/soundtrigger/SoundTriggerHwService.cpp index 377d30bcde..51afdcd82e 100644 --- a/services/soundtrigger/SoundTriggerHwService.cpp +++ b/services/soundtrigger/SoundTriggerHwService.cpp @@ -40,6 +40,32 @@ #define HW_MODULE_PREFIX "primary" namespace android { +namespace { + +// Given an IMemory, returns a copy of its content along with its size. +// Returns nullptr on failure or if input is nullptr. +std::pair<std::unique_ptr<uint8_t[]>, + size_t> CopyToArray(const sp<IMemory>& mem) { + if (mem == nullptr) { + return std::make_pair(nullptr, 0); + } + + const size_t size = mem->size(); + if (size == 0) { + return std::make_pair(nullptr, 0); + } + + std::unique_ptr<uint8_t[]> ar = std::make_unique<uint8_t[]>(size); + if (ar == nullptr) { + return std::make_pair(nullptr, 0); + } + + memcpy(ar.get(), mem->pointer(), size); + return std::make_pair(std::move(ar), size); +} + +} + SoundTriggerHwService::SoundTriggerHwService() : BnSoundTriggerHwService(), mNextUniqueId(1), @@ -557,8 +583,13 @@ status_t SoundTriggerHwService::Module::loadSoundModel(const sp<IMemory>& modelM return NO_INIT; } - struct sound_trigger_sound_model *sound_model = - (struct sound_trigger_sound_model *)modelMemory->pointer(); + auto immutableMemory = CopyToArray(modelMemory); + if (immutableMemory.first == nullptr) { + return NO_MEMORY; + } + + struct sound_trigger_sound_model* sound_model = + (struct sound_trigger_sound_model*) immutableMemory.first.get(); size_t structSize; if (sound_model->type == SOUND_MODEL_TYPE_KEYPHRASE) { @@ -568,9 +599,10 @@ status_t SoundTriggerHwService::Module::loadSoundModel(const sp<IMemory>& modelM } if (sound_model->data_offset < structSize || - sound_model->data_size > (UINT_MAX - sound_model->data_offset) || - modelMemory->size() < sound_model->data_offset || - sound_model->data_size > (modelMemory->size() - sound_model->data_offset)) { + sound_model->data_size > (UINT_MAX - sound_model->data_offset) || + immutableMemory.second < sound_model->data_offset || + sound_model->data_size > + (immutableMemory.second - sound_model->data_offset)) { android_errorWriteLog(0x534e4554, "30148546"); ALOGE("loadSoundModel() data_size is too big"); return BAD_VALUE; @@ -651,13 +683,19 @@ status_t SoundTriggerHwService::Module::startRecognition(sound_model_handle_t ha return NO_INIT; } - struct sound_trigger_recognition_config *config = - (struct sound_trigger_recognition_config *)dataMemory->pointer(); + auto immutableMemory = CopyToArray(dataMemory); + if (immutableMemory.first == nullptr) { + return NO_MEMORY; + } + + struct sound_trigger_recognition_config* config = + (struct sound_trigger_recognition_config*) immutableMemory.first.get(); if (config->data_offset < sizeof(struct sound_trigger_recognition_config) || - config->data_size > (UINT_MAX - config->data_offset) || - dataMemory->size() < config->data_offset || - config->data_size > (dataMemory->size() - config->data_offset)) { + config->data_size > (UINT_MAX - config->data_offset) || + immutableMemory.second < config->data_offset || + config->data_size > + (immutableMemory.second - config->data_offset)) { ALOGE("startRecognition() data_size is too big"); return BAD_VALUE; } |