87 lines
1.7 KiB
C
87 lines
1.7 KiB
C
#include <log.h>
|
|
#include <sections.h>
|
|
#include <nanowasm/nw.h>
|
|
#include <wasm_types.h>
|
|
#include <errno.h>
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
|
|
static int check_memory_type(FILE *const f)
|
|
{
|
|
return check_resizable_limits(f);
|
|
}
|
|
|
|
static int check(FILE *const f, const unsigned long len)
|
|
{
|
|
const long start = ftell(f);
|
|
|
|
if (start < 0)
|
|
{
|
|
LOG("%s: ftell(3): %s\n", __func__, strerror(errno));
|
|
return -1;
|
|
}
|
|
|
|
varuint32 count;
|
|
|
|
if (varuint32_read(f, &count))
|
|
{
|
|
LOG("%s: varuint32_read failed\n", __func__);
|
|
return -1;
|
|
}
|
|
|
|
for (varuint32 i = 0; i < count; i++)
|
|
if (check_memory_type(f))
|
|
{
|
|
LOG("%s: check_memory_type failed\n", __func__);
|
|
return -1;
|
|
}
|
|
|
|
const long end = ftell(f);
|
|
|
|
if (end < 0)
|
|
{
|
|
LOG("%s: ftell(3): %s\n", __func__, strerror(errno));
|
|
return -1;
|
|
}
|
|
|
|
const unsigned long size = end - start;
|
|
|
|
if (size != len)
|
|
{
|
|
LOG("%s: size exceeded (%lu expected, got %lu)\n",
|
|
__func__, len, size);
|
|
return -1;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
int section_memory_check(const struct section *const s,
|
|
const unsigned long len)
|
|
{
|
|
struct nw_mod *const m = s->m;
|
|
FILE *const f = s->f;
|
|
|
|
if (m->sections.memory)
|
|
{
|
|
LOG("%s: ignoring duplicate section\n", __func__);
|
|
return fseek(f, len, SEEK_CUR);
|
|
}
|
|
|
|
const long offset = ftell(f);
|
|
|
|
if (offset < 0)
|
|
{
|
|
LOG("%s: ftell(3): %s\n", __func__, strerror(errno));
|
|
return -1;
|
|
}
|
|
else if (check(f, len))
|
|
{
|
|
LOG("%s: check failed\n", __func__);
|
|
return -1;
|
|
}
|
|
|
|
m->sections.memory = offset;
|
|
return 0;
|
|
}
|