Prevent sharing or formatting of a vold managed volumes during encryption.
Mounting was already not allowed, but also unshare before starting
encryption, and don't allow sharing or formatting to be initiated
during encrytion.
Change-Id: Ida188d81f025739ba4dd90492b3e66088735991e
diff --git a/VolumeManager.cpp b/VolumeManager.cpp
index c1406a9..0f04a06 100644
--- a/VolumeManager.cpp
+++ b/VolumeManager.cpp
@@ -62,6 +62,7 @@
mSavedDirtyRatio = -1;
// set dirty ratio to 0 when UMS is active
mUmsDirtyRatio = 0;
+ mVolManagerDisabled = 0;
}
VolumeManager::~VolumeManager() {
@@ -168,6 +169,11 @@
return -1;
}
+ if (mVolManagerDisabled) {
+ errno = EBUSY;
+ return -1;
+ }
+
return v->formatVol();
}
@@ -940,6 +946,11 @@
return -1;
}
+ if (mVolManagerDisabled) {
+ errno = EBUSY;
+ return -1;
+ }
+
dev_t d = v->getShareDevice();
if ((MAJOR(d) == 0) && (MINOR(d) == 0)) {
// This volume does not support raw disk access
@@ -1030,8 +1041,10 @@
return 0;
}
-extern "C" int vold_unmountVol(const char *label) {
+extern "C" int vold_disableVol(const char *label) {
VolumeManager *vm = VolumeManager::Instance();
+ vm->disableVolumeManager();
+ vm->unshareVolume(label, "ums");
return vm->unmountVolume(label, true);
}
diff --git a/VolumeManager.h b/VolumeManager.h
index f526990..caa0b62 100644
--- a/VolumeManager.h
+++ b/VolumeManager.h
@@ -65,6 +65,7 @@
int mUmsSharingCount;
int mSavedDirtyRatio;
int mUmsDirtyRatio;
+ int mVolManagerDisabled;
public:
virtual ~VolumeManager();
@@ -83,6 +84,7 @@
int unshareVolume(const char *label, const char *method);
int shareEnabled(const char *path, const char *method, bool *enabled);
int formatVolume(const char *label);
+ void disableVolumeManager(void) { mVolManagerDisabled = 1; }
/* ASEC */
int createAsec(const char *id, unsigned numSectors, const char *fstype,
@@ -130,7 +132,7 @@
extern "C" {
#endif /* __cplusplus */
#define UNMOUNT_NOT_MOUNTED_ERR -2
- int vold_unmountVol(const char *label);
+ int vold_disableVol(const char *label);
int vold_getNumDirectVolumes(void);
int vold_getDirectVolumeList(struct volume_info *v);
#ifdef __cplusplus
diff --git a/cryptfs.c b/cryptfs.c
index a418225..50c3e64 100644
--- a/cryptfs.c
+++ b/cryptfs.c
@@ -1141,7 +1141,7 @@
}
close(fd);
- ret=vold_unmountVol(vol_list[i].label);
+ ret=vold_disableVol(vol_list[i].label);
if ((ret < 0) && (ret != UNMOUNT_NOT_MOUNTED_ERR)) {
/* -2 is returned when the device exists but is not currently mounted.
* ignore the error and continue. */