summaryrefslogtreecommitdiff
path: root/libfec
diff options
context:
space:
mode:
Diffstat (limited to 'libfec')
-rw-r--r--libfec/fec_verity.cpp32
1 files changed, 28 insertions, 4 deletions
diff --git a/libfec/fec_verity.cpp b/libfec/fec_verity.cpp
index 5dea53dd..3f636dd0 100644
--- a/libfec/fec_verity.cpp
+++ b/libfec/fec_verity.cpp
@@ -312,6 +312,11 @@ static int verify_tree(fec_handle *f, const uint8_t *root)
debug("valid");
+ if (v->hash) {
+ delete[] v->hash;
+ v->hash = NULL;
+ }
+
v->hash = data_hashes.release();
return 0;
}
@@ -319,7 +324,7 @@ static int verify_tree(fec_handle *f, const uint8_t *root)
/* reads, corrects and parses the verity table, validates parameters, and if
`f->flags' does not have `FEC_VERITY_DISABLE' set, calls `verify_tree' to
load and validate the hash tree */
-static int parse_table(fec_handle *f, uint64_t offset, uint32_t size)
+static int parse_table(fec_handle *f, uint64_t offset, uint32_t size, bool useecc)
{
check(f);
check(size >= VERITY_MIN_TABLE_SIZE);
@@ -335,8 +340,13 @@ static int parse_table(fec_handle *f, uint64_t offset, uint32_t size)
return -1;
}
- if (fec_pread(f, table.get(), size, offset) != (ssize_t)size) {
- error("failed to read verity table: %s", strerror(errno));
+ if (!useecc) {
+ if (!raw_pread(f, table.get(), size, offset)) {
+ error("failed to read verity table: %s", strerror(errno));
+ return -1;
+ }
+ } else if (fec_pread(f, table.get(), size, offset) != (ssize_t)size) {
+ error("failed to ecc read verity table: %s", strerror(errno));
return -1;
}
@@ -430,7 +440,18 @@ static int parse_table(fec_handle *f, uint64_t offset, uint32_t size)
check(v->data_blocks == v->hash_start / FEC_BLOCKSIZE);
}
+ if (v->salt) {
+ delete[] v->salt;
+ v->salt = NULL;
+ }
+
v->salt = salt.release();
+
+ if (v->table) {
+ delete[] v->table;
+ v->table = NULL;
+ }
+
v->table = table.release();
if (!(f->flags & FEC_VERITY_DISABLE)) {
@@ -589,7 +610,10 @@ int verity_parse_header(fec_handle *f, uint64_t offset)
v->metadata_start = offset;
- if (parse_table(f, offset + sizeof(v->header), v->header.length) == -1) {
+ if (parse_table(f, offset + sizeof(v->header), v->header.length,
+ false) == -1 &&
+ parse_table(f, offset + sizeof(v->header), v->header.length,
+ true) == -1) {
return -1;
}