diff options
author | Jin Qian <jinqian@google.com> | 2017-08-28 14:44:14 -0700 |
---|---|---|
committer | Theodore Ts'o <tytso@mit.edu> | 2018-02-26 12:23:14 -0500 |
commit | e1f7100643a46456be107b33098f6034b0835e6d (patch) | |
tree | 3469045351f869c30e5b40384dfe186e93f48fe9 | |
parent | 88ca49f99becad31b8193b5e8e0c9719430745c9 (diff) | |
download | e2fsprogs-e1f7100643a46456be107b33098f6034b0835e6d.tar.gz |
AOSP: mke2fs, libext2fs: make filesystem image reproducible
Override fs->now with env E2FSPROGS_FAKE_TIME
Override hash seed with -E hash_seed=<uuid>
Bug: 64994964
Change-Id: If1af7e990b5bf2939a7d5f2a9986406e12c294e9
From AOSP commit: 51663e0d2aa2958b5ef590299b2018a2ae01d256
-rw-r--r-- | lib/ext2fs/initialize.c | 6 | ||||
-rw-r--r-- | lib/ext2fs/openfs.c | 6 | ||||
-rw-r--r-- | misc/mke2fs.c | 22 |
3 files changed, 33 insertions, 1 deletions
diff --git a/lib/ext2fs/initialize.c b/lib/ext2fs/initialize.c index 99fedcd36..dbe798b27 100644 --- a/lib/ext2fs/initialize.c +++ b/lib/ext2fs/initialize.c @@ -107,6 +107,7 @@ errcode_t ext2fs_initialize(const char *name, int flags, char *buf = 0; char c; double reserved_ratio; + char *time_env; if (!param || !ext2fs_blocks_count(param)) return EXT2_ET_INVALID_ARGUMENT; @@ -123,6 +124,11 @@ errcode_t ext2fs_initialize(const char *name, int flags, #ifdef WORDS_BIGENDIAN fs->flags |= EXT2_FLAG_SWAP_BYTES; #endif + + time_env = getenv("E2FSPROGS_FAKE_TIME"); + if (time_env) + fs->now = strtoul(time_env, NULL, 0); + io_flags = IO_FLAG_RW; if (flags & EXT2_FLAG_EXCLUSIVE) io_flags |= IO_FLAG_EXCLUSIVE; diff --git a/lib/ext2fs/openfs.c b/lib/ext2fs/openfs.c index f74cd2458..506c025be 100644 --- a/lib/ext2fs/openfs.c +++ b/lib/ext2fs/openfs.c @@ -128,6 +128,7 @@ errcode_t ext2fs_open2(const char *name, const char *io_options, struct ext2_group_desc *gdp; int j; #endif + char *time_env; EXT2_CHECK_MAGIC(manager, EXT2_ET_MAGIC_IO_MANAGER); @@ -141,6 +142,11 @@ errcode_t ext2fs_open2(const char *name, const char *io_options, /* don't overwrite sb backups unless flag is explicitly cleared */ fs->flags |= EXT2_FLAG_MASTER_SB_ONLY; fs->umask = 022; + + time_env = getenv("E2FSPROGS_FAKE_TIME"); + if (time_env) + fs->now = strtoul(time_env, NULL, 0); + retval = ext2fs_get_mem(strlen(name)+1, &fs->device_name); if (retval) goto cleanup; diff --git a/misc/mke2fs.c b/misc/mke2fs.c index 0321fc4e2..8e13a95dc 100644 --- a/misc/mke2fs.c +++ b/misc/mke2fs.c @@ -105,6 +105,7 @@ static int proceed_delay = -1; static blk64_t dev_size; static struct ext2_super_block fs_param; +static __u32 zero_buf[4]; static char *fs_uuid = NULL; static char *creator_os; static char *volume_label; @@ -834,6 +835,19 @@ static void parse_extended_opts(struct ext2_super_block *param, continue; } param->s_desc_size = desc_size; + } else if (strcmp(token, "hash_seed") == 0) { + if (!arg) { + r_usage++; + badopt = token; + continue; + } + if (uuid_parse(arg, + (unsigned char *)param->s_hash_seed) != 0) { + fprintf(stderr, + _("Invalid hash seed: %s\n"), arg); + r_usage++; + continue; + } } else if (strcmp(token, "offset") == 0) { if (!arg) { r_usage++; @@ -2985,7 +2999,13 @@ int main (int argc, char *argv[]) free(hash_alg_str); fs->super->s_def_hash_version = (hash_alg >= 0) ? hash_alg : EXT2_HASH_HALF_MD4; - uuid_generate((unsigned char *) fs->super->s_hash_seed); + + if (memcmp(fs_param.s_hash_seed, zero_buf, + sizeof(fs_param.s_hash_seed)) != 0) { + memcpy(fs->super->s_hash_seed, fs_param.s_hash_seed, + sizeof(fs->super->s_hash_seed)); + } else + uuid_generate((unsigned char *) fs->super->s_hash_seed); /* * Periodic checks can be enabled/disabled via config file. |