Convert to lower fs path for createObb().
Since /storage/emulated/userId isn't accessible for users != userId, and vold should anyway try to avoid accessing the FUSE filesystem itself. Bug: 172078780 Test: atest StorageManagerTest --user-type secondary_user Change-Id: I98222bf844a6b7d8ec0d9873eddc71f61aa68c90
This commit is contained in:
parent
dfd36fe6b6
commit
d6a612ac20
1 changed files with 35 additions and 1 deletions
|
@ -1056,8 +1056,42 @@ int VolumeManager::createObb(const std::string& sourcePath, const std::string& s
|
||||||
int32_t ownerGid, std::string* outVolId) {
|
int32_t ownerGid, std::string* outVolId) {
|
||||||
int id = mNextObbId++;
|
int id = mNextObbId++;
|
||||||
|
|
||||||
|
std::string lowerSourcePath;
|
||||||
|
|
||||||
|
// Convert to lower filesystem path
|
||||||
|
if (StartsWith(sourcePath, "/storage/")) {
|
||||||
|
auto filter_fn = [&](const VolumeBase& vol) {
|
||||||
|
if (vol.getState() != VolumeBase::State::kMounted) {
|
||||||
|
// The volume must be mounted
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if ((vol.getMountFlags() & VolumeBase::MountFlags::kVisible) == 0) {
|
||||||
|
// and visible
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (vol.getInternalPath().empty()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (!sourcePath.empty() && StartsWith(sourcePath, vol.getPath())) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
};
|
||||||
|
auto volume = findVolumeWithFilter(filter_fn);
|
||||||
|
if (volume == nullptr) {
|
||||||
|
LOG(ERROR) << "Failed to find mounted volume for " << sourcePath;
|
||||||
|
return -EINVAL;
|
||||||
|
} else {
|
||||||
|
lowerSourcePath =
|
||||||
|
volume->getInternalPath() + sourcePath.substr(volume->getPath().length());
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
lowerSourcePath = sourcePath;
|
||||||
|
}
|
||||||
|
|
||||||
auto vol = std::shared_ptr<android::vold::VolumeBase>(
|
auto vol = std::shared_ptr<android::vold::VolumeBase>(
|
||||||
new android::vold::ObbVolume(id, sourcePath, sourceKey, ownerGid));
|
new android::vold::ObbVolume(id, lowerSourcePath, sourceKey, ownerGid));
|
||||||
vol->create();
|
vol->create();
|
||||||
|
|
||||||
mObbVolumes.push_back(vol);
|
mObbVolumes.push_back(vol);
|
||||||
|
|
Loading…
Reference in a new issue