Fix wiping problems and save ecrypt key
Fix problems with the wiping of data/media devices Save and restore the ecryptfs key for external sdcard on Samsung encrypted devices.
This commit is contained in:
@@ -760,6 +760,13 @@ bool TWPartition::Wipe(string New_File_System) {
|
||||
if (Mount_Point == "/cache")
|
||||
tmplog_offset = 0;
|
||||
|
||||
#ifdef TW_INCLUDE_CRYPTO_SAMSUNG
|
||||
if (Mount_Point == "/data" && Mount(false)) {
|
||||
if (TWFunc::Path_Exists("/data/system/edk_p_sd"))
|
||||
TWFunc::copy_file("/data/system/edk_p_sd", "/tmp/edk_p_sd", 0600);
|
||||
}
|
||||
#endif
|
||||
|
||||
if (Has_Data_Media)
|
||||
return Wipe_Data_Without_Wiping_Media();
|
||||
|
||||
@@ -775,7 +782,7 @@ bool TWPartition::Wipe(string New_File_System) {
|
||||
wiped = Wipe_EXT23(New_File_System);
|
||||
else if (New_File_System == "vfat")
|
||||
wiped = Wipe_FAT();
|
||||
if (New_File_System == "exfat")
|
||||
else if (New_File_System == "exfat")
|
||||
wiped = Wipe_EXFAT();
|
||||
else if (New_File_System == "yaffs2")
|
||||
wiped = Wipe_MTD();
|
||||
@@ -785,6 +792,14 @@ bool TWPartition::Wipe(string New_File_System) {
|
||||
}
|
||||
|
||||
if (wiped) {
|
||||
#ifdef TW_INCLUDE_CRYPTO_SAMSUNG
|
||||
if (Mount_Point == "/data" && Mount(false)) {
|
||||
if (TWFunc::Path_Exists("/tmp/edk_p_sd")) {
|
||||
Make_Dir("/data/system", true);
|
||||
TWFunc::copy_file("/tmp/edk_p_sd", "/data/system/edk_p_sd", 0600);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
Setup_File_System(false);
|
||||
if (Is_Encrypted && !Is_Decrypted) {
|
||||
// just wiped an encrypted partition back to its unencrypted state
|
||||
@@ -1178,10 +1193,23 @@ bool TWPartition::Wipe_Data_Without_Wiping_Media() {
|
||||
|
||||
dir = "/data/";
|
||||
dir.append(de->d_name);
|
||||
TWFunc::removeDir(dir, false);
|
||||
if (de->d_type == DT_DIR) {
|
||||
TWFunc::removeDir(dir, false);
|
||||
} else if (de->d_type == DT_REG || de->d_type == DT_LNK) {
|
||||
if (!unlink(dir.c_str()))
|
||||
LOGI("Unable to unlink '%s'\n", dir.c_str());
|
||||
}
|
||||
}
|
||||
closedir(d);
|
||||
ui_print("Done.\n");
|
||||
#ifdef TW_INCLUDE_CRYPTO_SAMSUNG
|
||||
if (Mount_Point == "/data" && Mount(false)) {
|
||||
if (TWFunc::Path_Exists("/tmp/edk_p_sd")) {
|
||||
Make_Dir("/data/system", true);
|
||||
TWFunc::copy_file("/tmp/edk_p_sd", "/data/system/edk_p_sd", 0600);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
return true;
|
||||
}
|
||||
ui_print("Dirent failed to open /data, error!\n");
|
||||
|
||||
@@ -401,38 +401,38 @@ void TWFunc::check_and_run_script(const char* script_file, const char* display_n
|
||||
}
|
||||
|
||||
int TWFunc::removeDir(const string path, bool skipParent) {
|
||||
DIR *d = opendir(path.c_str());
|
||||
int r = 0;
|
||||
string new_path;
|
||||
DIR *d = opendir(path.c_str());
|
||||
int r = 0;
|
||||
string new_path;
|
||||
|
||||
if (d == NULL) {
|
||||
LOGE("Error opening '%s'\n", path.c_str());
|
||||
return -1;
|
||||
}
|
||||
if (d == NULL) {
|
||||
LOGE("Error opening '%s'\n", path.c_str());
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (d) {
|
||||
struct dirent *p;
|
||||
while (!r && (p = readdir(d))) {
|
||||
if (d) {
|
||||
struct dirent *p;
|
||||
while (!r && (p = readdir(d))) {
|
||||
LOGI("checking :%s\n", p->d_name);
|
||||
if (!strcmp(p->d_name, ".") || !strcmp(p->d_name, ".."))
|
||||
continue;
|
||||
new_path = path + "/";
|
||||
new_path.append(p->d_name);
|
||||
if (p->d_type == DT_DIR) {
|
||||
r = removeDir(new_path, true);
|
||||
if (!r) {
|
||||
if (!strcmp(p->d_name, ".") || !strcmp(p->d_name, ".."))
|
||||
continue;
|
||||
new_path = path + "/";
|
||||
new_path.append(p->d_name);
|
||||
if (p->d_type == DT_DIR) {
|
||||
r = removeDir(new_path, true);
|
||||
if (!r) {
|
||||
if (p->d_type == DT_DIR)
|
||||
r = rmdir(new_path.c_str());
|
||||
else
|
||||
LOGI("Unable to removeDir '%s': %s\n", new_path.c_str(), strerror(errno));
|
||||
}
|
||||
} else {
|
||||
r = unlink(new_path.c_str());
|
||||
if (!r)
|
||||
LOGI("Unable to unlink '%s'\n", new_path.c_str());
|
||||
}
|
||||
}
|
||||
closedir(d);
|
||||
} else if (p->d_type == DT_REG || p->d_type == DT_LNK) {
|
||||
r = unlink(new_path.c_str());
|
||||
if (!r)
|
||||
LOGI("Unable to unlink '%s'\n", new_path.c_str());
|
||||
}
|
||||
}
|
||||
closedir(d);
|
||||
|
||||
if (!r) {
|
||||
if (skipParent)
|
||||
@@ -440,8 +440,8 @@ int TWFunc::removeDir(const string path, bool skipParent) {
|
||||
else
|
||||
r = rmdir(path.c_str());
|
||||
}
|
||||
}
|
||||
return r;
|
||||
}
|
||||
return r;
|
||||
}
|
||||
|
||||
int TWFunc::copy_file(string src, string dst, int mode) {
|
||||
|
||||
Reference in New Issue
Block a user