Merge "recovery: handle security footer before passing size to mke2fs" am: 539ed9acb1 am: 786177f7e6

am: 2b95e0d0aa

Change-Id: Ic0ba2478daddb56382b06e321ff11209b8702576
This commit is contained in:
Jin Qian
2017-07-25 19:31:42 +00:00
committed by android-build-merger
+28 -11
View File
@@ -28,6 +28,7 @@
#include <android-base/logging.h> #include <android-base/logging.h>
#include <android-base/properties.h> #include <android-base/properties.h>
#include <android-base/stringprintf.h> #include <android-base/stringprintf.h>
#include <android-base/unique_fd.h>
#include <cryptfs.h> #include <cryptfs.h>
#include <ext4_utils/wipe.h> #include <ext4_utils/wipe.h>
#include <fs_mgr.h> #include <fs_mgr.h>
@@ -165,6 +166,23 @@ static int exec_cmd(const char* path, char* const argv[]) {
return WEXITSTATUS(status); return WEXITSTATUS(status);
} }
static ssize_t get_file_size(int fd, uint64_t reserve_len) {
struct stat buf;
int ret = fstat(fd, &buf);
if (ret) return 0;
ssize_t computed_size;
if (S_ISREG(buf.st_mode)) {
computed_size = buf.st_size - reserve_len;
} else if (S_ISBLK(buf.st_mode)) {
computed_size = get_block_device_size(fd) - reserve_len;
} else {
computed_size = 0;
}
return computed_size;
}
int format_volume(const char* volume, const char* directory) { int format_volume(const char* volume, const char* directory) {
Volume* v = volume_for_path(volume); Volume* v = volume_for_path(volume);
if (v == NULL) { if (v == NULL) {
@@ -204,7 +222,16 @@ int format_volume(const char* volume, const char* directory) {
if (v->length != 0) { if (v->length != 0) {
length = v->length; length = v->length;
} else if (v->key_loc != NULL && strcmp(v->key_loc, "footer") == 0) { } else if (v->key_loc != NULL && strcmp(v->key_loc, "footer") == 0) {
length = -CRYPT_FOOTER_OFFSET; android::base::unique_fd fd(open(v->blk_device, O_RDONLY));
if (fd < 0) {
PLOG(ERROR) << "get_file_size: failed to open " << v->blk_device;
return -1;
}
length = get_file_size(fd.get(), CRYPT_FOOTER_OFFSET);
if (length <= 0) {
LOG(ERROR) << "get_file_size: invalid size " << length << " for " << v->blk_device;
return -1;
}
} }
int result; int result;
if (strcmp(v->fs_type, "ext4") == 0) { if (strcmp(v->fs_type, "ext4") == 0) {
@@ -262,16 +289,6 @@ int format_volume(const char* volume, const char* directory) {
result = exec_cmd(e2fsdroid_argv[0], const_cast<char**>(e2fsdroid_argv)); result = exec_cmd(e2fsdroid_argv[0], const_cast<char**>(e2fsdroid_argv));
} }
} else { /* Has to be f2fs because we checked earlier. */ } else { /* Has to be f2fs because we checked earlier. */
if (v->key_loc != NULL && strcmp(v->key_loc, "footer") == 0 && length < 0) {
LOG(ERROR) << "format_volume: crypt footer + negative length (" << length
<< ") not supported on " << v->fs_type;
return -1;
}
if (length < 0) {
LOG(ERROR) << "format_volume: negative length (" << length
<< ") not supported on " << v->fs_type;
return -1;
}
char *num_sectors = nullptr; char *num_sectors = nullptr;
if (length >= 512 && asprintf(&num_sectors, "%zd", length / 512) <= 0) { if (length >= 512 && asprintf(&num_sectors, "%zd", length / 512) <= 0) {
LOG(ERROR) << "format_volume: failed to create " << v->fs_type LOG(ERROR) << "format_volume: failed to create " << v->fs_type