#include #include #include #include #include static int check_value_type(FILE *const f) { varint7 value_type; if (varint7_read(f, &value_type)) { fprintf(stderr, "%s: varint7_read failed\n", __func__); return -1; } return 0; } static int check_func_type(FILE *const f) { varint7 form; varuint32 param_count; if (varint7_read(f, &form)) { fprintf(stderr, "%s: varint7_read failed\n", __func__); return -1; } else if (varuint32_read(f, ¶m_count)) { fprintf(stderr, "%s: varuint32_read failed\n", __func__); return -1; } for (varuint32 i = 0; i < param_count; i++) if (check_value_type(f)) { fprintf(stderr, "%s: check_value_type failed\n", __func__); return -1; } varuint1 return_count; if (varuint1_read(f, &return_count)) { fprintf(stderr, "%s: varuint1_read failed\n", __func__); return -1; } else if (return_count && check_value_type(f)) { fprintf(stderr, "%s: check_value_type 2 failed\n", __func__); return -1; } return 0; } static int check(FILE *const f, const unsigned long len) { const long start = ftell(f); varuint32 count; if (start < 0) { fprintf(stderr, "%s: ftell(3): %s\n", __func__, strerror(errno)); return -1; } else if (varuint32_read(f, &count)) { fprintf(stderr, "%s: varuint32_read failed\n", __func__); return -1; } for (varuint32 i = 0; i < count; i++) if (check_func_type(f)) { fprintf(stderr, "%s: check_func_type failed\n", __func__); return -1; } const long end = ftell(f); if (end < 0) { fprintf(stderr, "%s: ftell(3): %s\n", __func__, strerror(errno)); return -1; } const unsigned long size = end - start; if (size != len) { fprintf(stderr, "%s: size exceeded (%lu expected, got %lu)\n", __func__, len, size); return -1; } return 0; } int section_type(struct wasmfs *const w, FILE *const f, const unsigned long len) { if (w->sections.type) { fprintf(stderr, "%s: ignoring duplicate section\n", __func__); return 0; } const long offset = ftell(f); if (offset < 0) { fprintf(stderr, "%s: ftell(3): %s\n", __func__, strerror(errno)); return -1; } else if (check(f, len)) { fprintf(stderr, "%s: check failed\n", __func__); return -1; } w->sections.type = offset; return 0; }