rendered paste bodydiff --git a/src/hal/drivers/mesa-hostmot2/bitfile.c b/src/hal/drivers/mesa-hostmot2/bitfile.c
index ac10300..4bed0c0 100644
--- a/src/hal/drivers/mesa-hostmot2/bitfile.c
+++ b/src/hal/drivers/mesa-hostmot2/bitfile.c
@@ -37,20 +37,22 @@
static int bitfile_do_small_chunk(const struct firmware *fw, bitfile_chunk_t *chunk, int *i) {
- if (*i + 2 > fw->size) {
+ if ((*i) + 2 > fw->size) {
HM2_PRINT_NO_LL("bitfile chunk extends past end of firmware\n");
return -ENODATA;
}
- chunk->size = (fw->data[*i] * 256) + fw->data[*i + 1];
+ chunk->size = (fw->data[(*i)] * 256) + fw->data[(*i) + 1];
(*i) += 2;
+ HM2_PRINT_NO_LL("small chunk size is %d\n", chunk->size);
- if (*i + chunk->size > fw->size) {
+ if ((*i) + chunk->size > fw->size) {
HM2_PRINT_NO_LL("bitfile chunk extends past end of firmware\n");
return -ENODATA;
}
- chunk->data = &fw->data[*i];
+ chunk->data = &fw->data[(*i)];
+ HM2_PRINT_NO_LL("small chunk data pointer is %p\n", chunk->data);
if (chunk->data[chunk->size - 1] != '\0') {
HM2_PRINT_NO_LL("bitfile small chunk is not NULL terminated\n");
@@ -66,21 +68,23 @@ static int bitfile_do_small_chunk(const struct firmware *fw, bitfile_chunk_t *ch
static int bitfile_do_big_chunk(const struct firmware *fw, bitfile_chunk_t *chunk, int *i) {
- if (*i + 4 > fw->size) {
+ if ((*i) + 4 > fw->size) {
HM2_PRINT_NO_LL("bitfile chunk extends past end of firmware\n");
return -ENODATA;
}
- chunk->size = ((uint32_t)fw->data[*i] << 24) + ((uint32_t)fw->data[*i + 1] << 16) + ((uint32_t)fw->data[*i + 2] << 8) + fw->data[*i + 3];
+ chunk->size = ((uint32_t)fw->data[(*i)] << 24) + ((uint32_t)fw->data[(*i) + 1] << 16) + ((uint32_t)fw->data[(*i) + 2] << 8) + fw->data[(*i) + 3];
(*i) += 4;
+ HM2_PRINT_NO_LL("big chunk size is %d\n", chunk->size);
- if (*i + chunk->size > fw->size) {
+ if ((*i) + chunk->size > fw->size) {
HM2_PRINT_NO_LL("bitfile chunk extends past end of firmware\n");
return -ENODATA;
}
- chunk->data = &fw->data[*i];
+ chunk->data = &fw->data[(*i)];
(*i) += chunk->size;
+ HM2_PRINT_NO_LL("big chunk data pointer is %p\n", chunk->data);
return 0;
}
@@ -93,6 +97,12 @@ static int bitfile_parse_and_verify_chunk(const struct firmware *fw, bitfile_t *
tag = fw->data[*i];
(*i) ++;
+ HM2_PRINT_NO_LL("chunk tag is %c\n", tag);
+
+ if ((*i) > fw->size) {
+ HM2_PRINT_NO_LL("bitfile chunk '%c' size fell off the end!\n", tag);
+ return -ENODATA;
+ }
switch (tag) {
case 'a':
@@ -165,6 +175,8 @@ int bitfile_parse_and_verify(const struct firmware *fw, bitfile_t *bitfile) {
// verify the header
//
+ HM2_PRINT_NO_LL("fw size is %d\n", fw->size);
+
if (fw->size < BITFILE_HEADERLEN) {
HM2_PRINT_NO_LL("bitfile is too short\n");
return -ENODATA;
@@ -183,7 +195,9 @@ int bitfile_parse_and_verify(const struct firmware *fw, bitfile_t *bitfile) {
//
while (i < fw->size) {
+ HM2_PRINT_NO_LL("checking chunk at offset %d\n", i);
r = bitfile_parse_and_verify_chunk(fw, bitfile, &i);
+ HM2_PRINT_NO_LL("chunk done at offset %d\n", i);
if (r != 0) return r;
}