From d3938b4add12bdf8c8072b63c3839ccb0c6e14fb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?John=20H=C3=B6gberg?= Date: Thu, 11 Apr 2019 15:11:34 +0200 Subject: [PATCH] fixup! Refactor trapping and trap more often during decode We never leave the NIF during encoding or decoding, so we're not going to start working on a different binary or screw the arguments up. Add assertions when trapping/returning and leave it at that. --- c_src/decoder.c | 23 +++++------------------ c_src/encoder.c | 8 +++----- 2 files changed, 8 insertions(+), 23 deletions(-) diff --git a/c_src/decoder.c b/c_src/decoder.c index e01a4fd..c18d5fe 100644 --- a/c_src/decoder.c +++ b/c_src/decoder.c @@ -89,7 +89,7 @@ dec_new(ErlNifEnv* env) d->p = NULL; d->len = -1; - d->i = -1; + d->i = 0; d->st_data = (char*) enif_alloc(STACK_SIZE_INC); d->st_size = STACK_SIZE_INC; @@ -113,16 +113,6 @@ dec_init(Decoder* d, ErlNifEnv* env, ERL_NIF_TERM arg, ErlNifBinary* bin) d->p = bin->data; d->len = bin->size; - - // I'd like to be more forceful on this check so that when - // we run a second iteration of the decoder we are sure - // that we're using the same binary. Unfortunately, I don't - // think there's a value to base this assertion on. - if(d->i < 0) { - d->i = 0; - } else { - assert(d->i <= d->len && "mismatched binary lengths"); - } } void @@ -730,16 +720,10 @@ decode_iter(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) size_t start; size_t bytes_processed = 0; - if(argc != 5) { - return enif_make_badarg(env); - } else if(!enif_inspect_binary(env, argv[0], &bin)) { + if(!enif_inspect_binary(env, argv[0], &bin)) { return enif_make_badarg(env); } else if(!enif_get_resource(env, argv[1], st->res_dec, (void**) &d)) { return enif_make_badarg(env); - } else if(!enif_is_list(env, argv[3])) { - return enif_make_badarg(env); - } else if(!enif_is_list(env, argv[4])) { - return enif_make_badarg(env); } dec_init(d, env, argv[0], &bin); @@ -754,6 +738,9 @@ decode_iter(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) if(should_yield(env, bytes_processed, d->bytes_per_red)) { ERL_NIF_TERM tmp_argv[5]; + assert(enif_is_list(env, objs)); + assert(enif_is_list(env, curr)); + tmp_argv[0] = argv[0]; tmp_argv[1] = argv[1]; tmp_argv[2] = val; diff --git a/c_src/encoder.c b/c_src/encoder.c index 06838ca..4211280 100644 --- a/c_src/encoder.c +++ b/c_src/encoder.c @@ -776,11 +776,7 @@ encode_iter(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) size_t start; size_t bytes_processed = 0; - if(argc != 3) { - return enif_make_badarg(env); - } else if(!enif_get_resource(env, argv[0], st->res_enc, (void**) &e)) { - return enif_make_badarg(env); - } else if(!enif_is_list(env, argv[2])) { + if(!enif_get_resource(env, argv[0], st->res_enc, (void**) &e)) { return enif_make_badarg(env); } @@ -802,6 +798,8 @@ encode_iter(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) if(should_yield(env, bytes_processed, e->bytes_per_red)) { ERL_NIF_TERM tmp_argv[3]; + assert(enif_is_list(env, e->iolist)); + tmp_argv[0] = argv[0]; tmp_argv[1] = termstack_save(env, &stack); tmp_argv[2] = e->iolist;