aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBjörn Gustavsson <[email protected]>2019-05-29 16:16:37 +0200
committerBjörn Gustavsson <[email protected]>2019-05-29 16:31:06 +0200
commitf53097e9f856281e7d8d89dc42716fb77b26e36e (patch)
treea745f7f0f181d85de993d968d3ee1c0ed3a88ee4
parentda08da374cfa652374ddb46846550cc83798c2ab (diff)
downloadotp-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.
-rw-r--r--lib/erl_interface/src/decode/decode_fun.c10
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;