diff options
author | Björn Gustavsson <[email protected]> | 2019-05-29 16:16:37 +0200 |
---|---|---|
committer | Björn Gustavsson <[email protected]> | 2019-05-29 16:31:06 +0200 |
commit | f53097e9f856281e7d8d89dc42716fb77b26e36e (patch) | |
tree | a745f7f0f181d85de993d968d3ee1c0ed3a88ee4 /lib | |
parent | da08da374cfa652374ddb46846550cc83798c2ab (diff) | |
download | otp-f53097e9f856281e7d8d89dc42716fb77b26e36e.tar.gz otp-f53097e9f856281e7d8d89dc42716fb77b26e36e.tar.bz2 otp-f53097e9f856281e7d8d89dc42716fb77b26e36e.zip |
Correct decoding of old funs (FUN_EXT)
If the environment is empty, don't access the free_vars pointer
and don't allocate a zero-size buffer. Better safe than sorry.
Diffstat (limited to 'lib')
-rw-r--r-- | lib/erl_interface/src/decode/decode_fun.c | 10 |
1 files changed, 6 insertions, 4 deletions
diff --git a/lib/erl_interface/src/decode/decode_fun.c b/lib/erl_interface/src/decode/decode_fun.c index 70e76e956c..db71007505 100644 --- a/lib/erl_interface/src/decode/decode_fun.c +++ b/lib/erl_interface/src/decode/decode_fun.c @@ -77,10 +77,12 @@ int ei_decode_fun(const char *buf, int *index, erlang_fun *p) } if (p != NULL) { p->u.closure.n_free_vars = n; - p->u.closure.free_var_len = ix - ix0; - p->u.closure.free_vars = ei_malloc(ix - ix0); - if (!(p->u.closure.free_vars)) return -1; - memcpy(p->u.closure.free_vars, s + ix0, ix - ix0); + p->u.closure.free_var_len = ix - ix0; + if (p->u.closure.free_var_len > 0) { + p->u.closure.free_vars = ei_malloc(p->u.closure.free_var_len); + if (!(p->u.closure.free_vars)) return -1; + memcpy(p->u.closure.free_vars, s + ix0, p->u.closure.free_var_len); + } } s += ix; *index += s-s0; |