Commit 2a4af4f5 authored by Bernhard Nortmann's avatar Bernhard Nortmann
Browse files

fexc: Convert version[0] header field to filesize



Vendor-provided .bin files have repeatedly demonstrated that our
previous interpretation of this field as version[0] is likely
wrong. Instead, it seems to represent the file size (in bytes)
of the .bin file.

This commit fixes both decompilation (and header checks) and
generation of .bin files, where it will now store the size to
this field.

TODO: It's unclear whether the 'filesize' needs some specific
alignment (and the .bin corresponding padding). A value of
34864 (0x8830) has already been observed, so any possible
alignment is expected not to exceed 16 bytes (0x10). (Currently
our .bin generator doesn't care about any specific alignment.)
Signed-off-by: default avatarBernhard Nortmann <bernhard.nortmann@web.de>
parent bf735b2c
...@@ -97,7 +97,7 @@ size_t script_bin_size(struct script *script, ...@@ -97,7 +97,7 @@ size_t script_bin_size(struct script *script,
return bin_size; return bin_size;
} }
int script_generate_bin(void *bin, size_t UNUSED(bin_size), int script_generate_bin(void *bin, size_t bin_size,
struct script *script, struct script *script,
size_t sections, size_t entries) size_t sections, size_t entries)
{ {
...@@ -122,9 +122,9 @@ int script_generate_bin(void *bin, size_t UNUSED(bin_size), ...@@ -122,9 +122,9 @@ int script_generate_bin(void *bin, size_t UNUSED(bin_size),
(void*)data-bin); (void*)data-bin);
head->sections = sections; head->sections = sections;
head->version[0] = 0; head->filesize = bin_size;
head->version[1] = 1; head->version[0] = 1;
head->version[2] = 2; head->version[1] = 2;
for (ls = list_first(&script->sections); ls; for (ls = list_first(&script->sections); ls;
ls = list_next(&script->sections, ls)) { ls = list_next(&script->sections, ls)) {
...@@ -326,11 +326,10 @@ int script_decompile_bin(void *bin, size_t bin_size, ...@@ -326,11 +326,10 @@ int script_decompile_bin(void *bin, size_t bin_size,
unsigned int i; unsigned int i;
struct script_bin_head *head = bin; struct script_bin_head *head = bin;
if (((head->version[0] & 0x3FFF) > SCRIPT_BIN_VERSION_LIMIT) || if ((head->version[0] > SCRIPT_BIN_VERSION_LIMIT) ||
(head->version[1] > SCRIPT_BIN_VERSION_LIMIT) || (head->version[1] > SCRIPT_BIN_VERSION_LIMIT)) {
(head->version[2] > SCRIPT_BIN_VERSION_LIMIT)) { pr_err("Malformed data: version %u.%u.\n",
pr_err("Malformed data: version %u.%u.%u.\n", head->version[0], head->version[1]);
head->version[0], head->version[1], head->version[2]);
return 0; return 0;
} }
...@@ -340,10 +339,10 @@ int script_decompile_bin(void *bin, size_t bin_size, ...@@ -340,10 +339,10 @@ int script_decompile_bin(void *bin, size_t bin_size,
return 0; return 0;
} }
pr_info("%s: version: %u.%u.%u\n", filename, pr_info("%s: version: %u.%u\n", filename,
head->version[0] & 0x3FFF, head->version[1], head->version[2]); head->version[0], head->version[1]);
pr_info("%s: size: %zu (%u sections)\n", filename, pr_info("%s: size: %zu (%u sections), header value: %u\n", filename,
bin_size, head->sections); bin_size, head->sections, head->filesize);
/* TODO: SANITY: compare head.sections with bin_size */ /* TODO: SANITY: compare head.sections with bin_size */
for (i=0; i < head->sections; i++) { for (i=0; i < head->sections; i++) {
......
...@@ -27,7 +27,8 @@ struct script_bin_section { ...@@ -27,7 +27,8 @@ struct script_bin_section {
/** binary representation of the head of the script file */ /** binary representation of the head of the script file */
struct script_bin_head { struct script_bin_head {
uint32_t sections; uint32_t sections;
uint32_t version[3]; uint32_t filesize;
uint32_t version[2];
struct script_bin_section section[]; struct script_bin_section section[];
}; };
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment