diff options
author | Yurii Zubrytskyi <zyy@google.com> | 2020-04-17 23:13:47 -0700 |
---|---|---|
committer | Yurii Zubrytskyi <zyy@google.com> | 2020-04-22 00:49:02 -0700 |
commit | 629051fd6541e9e4378043d1132dcf98c9ca7726 (patch) | |
tree | cd566e00fdb6cdfeba4d8147b59c41796484d62c /services/incremental/IncrementalServiceValidation.cpp | |
parent | 360bbdc7203c851288d8e09d2eee2829975b210f (diff) |
[incfs] Use MountRegistry to import existing mounts on start
This is a big cleanup in IncrementalService that makes it behave
nicely on runtime restart, and more:
- fixed a bunch of threading issues in createStorage/bind
- made public functions correctly accept any path in any
bind mount and translate it to the proper root mount
- got rid of "using namespace" in headers, cleaned includes
- removed all unused functions
- set CLOEXEC bit on all duped FDs
Bug: 151241369
Test: atest PackageManagerShellCommandTest \
PackageManagerShellCommandIncrementalTest \
IncrementalServiceTest
Change-Id: Ided4415aabfbfca3925b5e71c91896055886ac4a
Diffstat (limited to 'services/incremental/IncrementalServiceValidation.cpp')
-rw-r--r-- | services/incremental/IncrementalServiceValidation.cpp | 77 |
1 files changed, 77 insertions, 0 deletions
diff --git a/services/incremental/IncrementalServiceValidation.cpp b/services/incremental/IncrementalServiceValidation.cpp new file mode 100644 index 000000000000..abadbbf10742 --- /dev/null +++ b/services/incremental/IncrementalServiceValidation.cpp @@ -0,0 +1,77 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "IncrementalServiceValidation.h" + +#include <android-base/stringprintf.h> +#include <binder/IPCThreadState.h> +#include <binder/PermissionCache.h> +#include <binder/PermissionController.h> +#include <errno.h> +#include <utils/String16.h> + +namespace android::incremental { + +binder::Status Ok() { + return binder::Status::ok(); +} + +binder::Status Exception(uint32_t code, const std::string& msg) { + return binder::Status::fromExceptionCode(code, String8(msg.c_str())); +} + +int fromBinderStatus(const binder::Status& status) { + return status.exceptionCode() == binder::Status::EX_SERVICE_SPECIFIC + ? status.serviceSpecificErrorCode() > 0 + ? -status.serviceSpecificErrorCode() + : status.serviceSpecificErrorCode() == 0 ? -EFAULT + : status.serviceSpecificErrorCode() + : -EIO; +} + +binder::Status CheckPermissionForDataDelivery(const char* permission, const char* operation, + const char* package) { + using android::base::StringPrintf; + + int32_t pid; + int32_t uid; + + if (!PermissionCache::checkCallingPermission(String16(permission), &pid, &uid)) { + return Exception(binder::Status::EX_SECURITY, + StringPrintf("UID %d / PID %d lacks permission %s", uid, pid, permission)); + } + + String16 packageName{package}; + + // Caller must also have op granted. + PermissionController pc; + if (auto packageUid = pc.getPackageUid(packageName, 0); packageUid != uid) { + return Exception(binder::Status::EX_SECURITY, + StringPrintf("UID %d / PID %d does not own package %s", uid, pid, + package)); + } + switch (auto result = pc.noteOp(String16(operation), uid, packageName); result) { + case PermissionController::MODE_ALLOWED: + case PermissionController::MODE_DEFAULT: + return binder::Status::ok(); + default: + return Exception(binder::Status::EX_SECURITY, + StringPrintf("UID %d / PID %d / package %s lacks app-op %s, error %d", + uid, pid, package, operation, result)); + } +} + +} // namespace android::incremental |