Merge "Clean up ASEC unmounting on physical storage." into klp-dev
This commit is contained in:
commit
bcdbd9ac06
4 changed files with 37 additions and 14 deletions
|
@ -321,15 +321,16 @@ void DirectVolume::handlePartitionRemoved(const char *devpath, NetlinkEvent *evt
|
|||
* Yikes, our mounted partition is going away!
|
||||
*/
|
||||
|
||||
bool providesAsec = (getFlags() & VOL_PROVIDES_ASEC) != 0;
|
||||
if (providesAsec && mVm->cleanupAsec(this, true)) {
|
||||
SLOGE("Failed to cleanup ASEC - unmount will probably fail!");
|
||||
}
|
||||
|
||||
snprintf(msg, sizeof(msg), "Volume %s %s bad removal (%d:%d)",
|
||||
getLabel(), getFuseMountpoint(), major, minor);
|
||||
mVm->getBroadcaster()->sendBroadcast(ResponseCode::VolumeBadRemoval,
|
||||
msg, false);
|
||||
|
||||
if (mVm->cleanupAsec(this, true)) {
|
||||
SLOGE("Failed to cleanup ASEC - unmount will probably fail!");
|
||||
}
|
||||
|
||||
if (Volume::unmountVol(true, false)) {
|
||||
SLOGE("Failed to unmount volume on bad removal (%s)",
|
||||
strerror(errno));
|
||||
|
|
|
@ -42,7 +42,6 @@ protected:
|
|||
int mDiskNumParts;
|
||||
unsigned int mPendingPartMap;
|
||||
int mIsDecrypted;
|
||||
int mFlags;
|
||||
|
||||
public:
|
||||
DirectVolume(VolumeManager *vm, const fstab_rec* rec, int flags);
|
||||
|
@ -65,7 +64,6 @@ protected:
|
|||
int updateDeviceInfo(char *new_path, int new_major, int new_minor);
|
||||
virtual void revertDeviceInfo(void);
|
||||
int isDecrypted() { return mIsDecrypted; }
|
||||
int getFlags() { return mFlags; }
|
||||
|
||||
private:
|
||||
void handleDiskAdded(const char *devpath, NetlinkEvent *evt);
|
||||
|
|
|
@ -72,6 +72,7 @@ const char *Volume::SEC_ASECDIR_EXT = "/mnt/secure/asec";
|
|||
* Path to internal storage where *only* root can access ASEC image files
|
||||
*/
|
||||
const char *Volume::SEC_ASECDIR_INT = "/data/app-asec";
|
||||
|
||||
/*
|
||||
* Path to where secure containers are mounted
|
||||
*/
|
||||
|
@ -480,6 +481,7 @@ int Volume::mountAsecExternal() {
|
|||
}
|
||||
|
||||
if (fs_prepare_dir(secure_path, 0770, AID_MEDIA_RW, AID_MEDIA_RW) != 0) {
|
||||
SLOGW("fs_prepare_dir failed: %s", strerror(errno));
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
@ -662,7 +664,7 @@ int Volume::extractMetadata(const char* devicePath) {
|
|||
char line[1024];
|
||||
char value[128];
|
||||
if (fgets(line, sizeof(line), fp) != NULL) {
|
||||
ALOGD("blkid reported: %s", line);
|
||||
ALOGD("blkid identified as %s", line);
|
||||
|
||||
char* start = strstr(line, "UUID=") + 5;
|
||||
if (sscanf(start, "\"%127[^\"]\"", value) == 1) {
|
||||
|
@ -678,6 +680,7 @@ int Volume::extractMetadata(const char* devicePath) {
|
|||
setUserLabel(NULL);
|
||||
}
|
||||
} else {
|
||||
ALOGW("blkid failed to identify %s", devicePath);
|
||||
res = -1;
|
||||
}
|
||||
|
||||
|
|
|
@ -1549,28 +1549,49 @@ bool VolumeManager::isMountpointMounted(const char *mp)
|
|||
}
|
||||
|
||||
int VolumeManager::cleanupAsec(Volume *v, bool force) {
|
||||
int rc = unmountAllAsecsInDir(Volume::SEC_ASECDIR_EXT);
|
||||
int rc = 0;
|
||||
|
||||
char asecFileName[255];
|
||||
|
||||
AsecIdCollection removeAsec;
|
||||
AsecIdCollection removeObb;
|
||||
|
||||
AsecIdCollection toUnmount;
|
||||
// Find the remaining OBB files that are on external storage.
|
||||
for (AsecIdCollection::iterator it = mActiveContainers->begin(); it != mActiveContainers->end();
|
||||
++it) {
|
||||
ContainerData* cd = *it;
|
||||
|
||||
if (cd->type == ASEC) {
|
||||
// nothing
|
||||
if (findAsec(cd->id, asecFileName, sizeof(asecFileName))) {
|
||||
SLOGE("Couldn't find ASEC %s; cleaning up", cd->id);
|
||||
removeAsec.push_back(cd);
|
||||
} else {
|
||||
SLOGD("Found ASEC at path %s", asecFileName);
|
||||
if (!strncmp(asecFileName, Volume::SEC_ASECDIR_EXT,
|
||||
strlen(Volume::SEC_ASECDIR_EXT))) {
|
||||
removeAsec.push_back(cd);
|
||||
}
|
||||
}
|
||||
} else if (cd->type == OBB) {
|
||||
if (v == getVolumeForFile(cd->id)) {
|
||||
toUnmount.push_back(cd);
|
||||
removeObb.push_back(cd);
|
||||
}
|
||||
} else {
|
||||
SLOGE("Unknown container type %d!", cd->type);
|
||||
}
|
||||
}
|
||||
|
||||
for (AsecIdCollection::iterator it = toUnmount.begin(); it != toUnmount.end(); ++it) {
|
||||
for (AsecIdCollection::iterator it = removeAsec.begin(); it != removeAsec.end(); ++it) {
|
||||
ContainerData *cd = *it;
|
||||
SLOGI("Unmounting ASEC %s (dependant on %s)", cd->id, v->getFuseMountpoint());
|
||||
SLOGI("Unmounting ASEC %s (dependent on %s)", cd->id, v->getLabel());
|
||||
if (unmountAsec(cd->id, force)) {
|
||||
SLOGE("Failed to unmount ASEC %s (%s)", cd->id, strerror(errno));
|
||||
rc = -1;
|
||||
}
|
||||
}
|
||||
|
||||
for (AsecIdCollection::iterator it = removeObb.begin(); it != removeObb.end(); ++it) {
|
||||
ContainerData *cd = *it;
|
||||
SLOGI("Unmounting OBB %s (dependent on %s)", cd->id, v->getLabel());
|
||||
if (unmountObb(cd->id, force)) {
|
||||
SLOGE("Failed to unmount OBB %s (%s)", cd->id, strerror(errno));
|
||||
rc = -1;
|
||||
|
|
Loading…
Reference in a new issue