summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/binary-reader.cc2
-rw-r--r--src/common.h13
-rw-r--r--src/config.h.in2
-rw-r--r--src/literal.cc4
-rw-r--r--src/resolve-names.cc3
-rw-r--r--src/tools/wasm-interp.cc8
-rw-r--r--src/tools/wasm-link.cc8
-rw-r--r--src/tools/wasm2wast.cc8
-rw-r--r--src/tools/wasmdump.cc8
-rw-r--r--src/tools/wasmopcodecnt.cc8
-rw-r--r--src/tools/wast-desugar.cc8
-rw-r--r--src/tools/wast2wasm.cc8
12 files changed, 71 insertions, 9 deletions
diff --git a/src/binary-reader.cc b/src/binary-reader.cc
index 778c1ed6..4425f6ea 100644
--- a/src/binary-reader.cc
+++ b/src/binary-reader.cc
@@ -950,6 +950,8 @@ static void read_names_section(Context* ctx, uint32_t section_size) {
for (uint32_t j = 0; j < num_funcs; ++j) {
uint32_t function_index;
in_u32_leb128(ctx, &function_index, "function index");
+ RAISE_ERROR_UNLESS(function_index < num_total_funcs(ctx),
+ "invalid function index: %u", function_index);
uint32_t num_locals;
in_u32_leb128(ctx, &num_locals, "local count");
CALLBACK(OnLocalNameLocalCount, function_index, num_locals);
diff --git a/src/common.h b/src/common.h
index 40be6e34..152800bd 100644
--- a/src/common.h
+++ b/src/common.h
@@ -73,6 +73,19 @@
type(const type&) = delete; \
type& operator=(const type&) = delete;
+#if WITH_EXCEPTIONS
+#define WABT_TRY try {
+#define WABT_CATCH_BAD_ALLOC_AND_EXIT \
+ } \
+ catch (std::bad_alloc&) { \
+ WABT_FATAL("Memory allocation failure.\n"); \
+ }
+#else
+#define WABT_TRY
+#define WABT_CATCH_BAD_ALLOC_AND_EXIT
+#endif
+
+
namespace wabt {
enum class Result {
diff --git a/src/config.h.in b/src/config.h.in
index d3101eb4..b2dc04b4 100644
--- a/src/config.h.in
+++ b/src/config.h.in
@@ -41,6 +41,8 @@
#cmakedefine01 COMPILER_IS_GNU
#cmakedefine01 COMPILER_IS_MSVC
+#cmakedefine01 WITH_EXCEPTIONS
+
#define SIZEOF_SIZE_T @SIZEOF_SIZE_T@
#define SIZEOF_INT @SIZEOF_INT@
#define SIZEOF_LONG @SIZEOF_LONG@
diff --git a/src/literal.cc b/src/literal.cc
index 75efa1fe..8e025ace 100644
--- a/src/literal.cc
+++ b/src/literal.cc
@@ -376,7 +376,7 @@ static void parse_float_infinity(const char* s,
} else if (*s == '+') {
s++;
}
- assert(string_starts_with(s, end, "infinity"));
+ assert(string_starts_with(s, end, "inf")); // Could be inf or infinity.
*out_bits = make_float(is_neg, F32_MAX_EXP, 0);
}
@@ -716,7 +716,7 @@ static void parse_double_infinity(const char* s,
} else if (*s == '+') {
s++;
}
- assert(string_starts_with(s, end, "infinity"));
+ assert(string_starts_with(s, end, "inf")); // Could be inf or infinity.
*out_bits = make_double(is_neg, F64_MAX_EXP, 0);
}
diff --git a/src/resolve-names.cc b/src/resolve-names.cc
index f68c4ee4..fb823c5c 100644
--- a/src/resolve-names.cc
+++ b/src/resolve-names.cc
@@ -150,6 +150,9 @@ static void resolve_memory_var(Context* ctx, Var* var) {
static void resolve_local_var(Context* ctx, Var* var) {
if (var->type == VarType::Name) {
+ if (!ctx->current_func)
+ return;
+
int index = get_local_index_by_var(ctx->current_func, var);
if (index == -1) {
print_error(ctx, &var->loc,
diff --git a/src/tools/wasm-interp.cc b/src/tools/wasm-interp.cc
index 44bb1e25..a4da13f8 100644
--- a/src/tools/wasm-interp.cc
+++ b/src/tools/wasm-interp.cc
@@ -1618,7 +1618,7 @@ static Result read_and_run_spec_json(const char* spec_json_filename) {
return result;
}
-int main(int argc, char** argv) {
+int ProgramMain(int argc, char** argv) {
init_stdio();
parse_options(argc, argv);
@@ -1632,3 +1632,9 @@ int main(int argc, char** argv) {
}
return result != Result::Ok;
}
+
+int main(int argc, char** argv) {
+ WABT_TRY
+ return ProgramMain(argc, argv);
+ WABT_CATCH_BAD_ALLOC_AND_EXIT
+}
diff --git a/src/tools/wasm-link.cc b/src/tools/wasm-link.cc
index 7ecfb71d..d21e586f 100644
--- a/src/tools/wasm-link.cc
+++ b/src/tools/wasm-link.cc
@@ -829,7 +829,7 @@ static Result perform_link(Context* ctx) {
return Result::Ok;
}
-int main(int argc, char** argv) {
+int ProgramMain(int argc, char** argv) {
init_stdio();
Context context;
@@ -860,3 +860,9 @@ int main(int argc, char** argv) {
result = perform_link(&context);
return result != Result::Ok;
}
+
+int main(int argc, char** argv) {
+ WABT_TRY
+ return ProgramMain(argc, argv);
+ WABT_CATCH_BAD_ALLOC_AND_EXIT
+}
diff --git a/src/tools/wasm2wast.cc b/src/tools/wasm2wast.cc
index 7f3ef1d1..94dd3fa8 100644
--- a/src/tools/wasm2wast.cc
+++ b/src/tools/wasm2wast.cc
@@ -131,7 +131,7 @@ static void parse_options(int argc, char** argv) {
}
}
-int main(int argc, char** argv) {
+int ProgramMain(int argc, char** argv) {
Result result;
init_stdio();
@@ -166,3 +166,9 @@ int main(int argc, char** argv) {
}
return result != Result::Ok;
}
+
+int main(int argc, char** argv) {
+ WABT_TRY
+ return ProgramMain(argc, argv);
+ WABT_CATCH_BAD_ALLOC_AND_EXIT
+}
diff --git a/src/tools/wasmdump.cc b/src/tools/wasmdump.cc
index fc1b3cd6..37651277 100644
--- a/src/tools/wasmdump.cc
+++ b/src/tools/wasmdump.cc
@@ -194,7 +194,7 @@ done:
return result;
}
-int main(int argc, char** argv) {
+int ProgramMain(int argc, char** argv) {
init_stdio();
parse_options(argc, argv);
@@ -216,3 +216,9 @@ int main(int argc, char** argv) {
return 0;
}
+
+int main(int argc, char** argv) {
+ WABT_TRY
+ return ProgramMain(argc, argv);
+ WABT_CATCH_BAD_ALLOC_AND_EXIT
+}
diff --git a/src/tools/wasmopcodecnt.cc b/src/tools/wasmopcodecnt.cc
index b99051bb..49c1c822 100644
--- a/src/tools/wasmopcodecnt.cc
+++ b/src/tools/wasmopcodecnt.cc
@@ -284,7 +284,7 @@ static void display_sorted_int_pair_counter_vector(
display_second_fcn, opcode_name);
}
-int main(int argc, char** argv) {
+int ProgramMain(int argc, char** argv) {
init_stdio();
parse_options(argc, argv);
@@ -333,3 +333,9 @@ int main(int argc, char** argv) {
delete[] data;
return result != Result::Ok;
}
+
+int main(int argc, char** argv) {
+ WABT_TRY
+ return ProgramMain(argc, argv);
+ WABT_CATCH_BAD_ALLOC_AND_EXIT
+}
diff --git a/src/tools/wast-desugar.cc b/src/tools/wast-desugar.cc
index 0642d682..b1418e6c 100644
--- a/src/tools/wast-desugar.cc
+++ b/src/tools/wast-desugar.cc
@@ -124,7 +124,7 @@ struct Context {
Result result;
};
-int main(int argc, char** argv) {
+int ProgramMain(int argc, char** argv) {
init_stdio();
parse_options(argc, argv);
@@ -157,3 +157,9 @@ int main(int argc, char** argv) {
delete script;
return result != Result::Ok;
}
+
+int main(int argc, char** argv) {
+ WABT_TRY
+ return ProgramMain(argc, argv);
+ WABT_CATCH_BAD_ALLOC_AND_EXIT
+}
diff --git a/src/tools/wast2wasm.cc b/src/tools/wast2wasm.cc
index 9ab56afe..9296dd5e 100644
--- a/src/tools/wast2wasm.cc
+++ b/src/tools/wast2wasm.cc
@@ -193,7 +193,7 @@ static void write_buffer_to_file(const char* filename,
}
}
-int main(int argc, char** argv) {
+int ProgramMain(int argc, char** argv) {
init_stdio();
parse_options(argc, argv);
@@ -239,3 +239,9 @@ int main(int argc, char** argv) {
delete script;
return result != Result::Ok;
}
+
+int main(int argc, char** argv) {
+ WABT_TRY
+ return ProgramMain(argc, argv);
+ WABT_CATCH_BAD_ALLOC_AND_EXIT
+}