diff options
author | Dan Gudmundsson <[email protected]> | 2017-10-23 12:07:55 +0200 |
---|---|---|
committer | Dan Gudmundsson <[email protected]> | 2017-10-23 12:07:55 +0200 |
commit | fcbace8f04c741652820d9f91c6de7b49c92c1d9 (patch) | |
tree | 0e25d4ca3c4288c41cb92d09adf9eed7a7dff7fd | |
parent | faddc82d3c8c25fbddb1074d511582b8ac020c38 (diff) | |
parent | 823cab1ec24af0235195b14ee66a8642e4913699 (diff) | |
download | otp-fcbace8f04c741652820d9f91c6de7b49c92c1d9.tar.gz otp-fcbace8f04c741652820d9f91c6de7b49c92c1d9.tar.bz2 otp-fcbace8f04c741652820d9f91c6de7b49c92c1d9.zip |
Merge branch 'dgud/wx/fix-empty-binaries/OTP-14688' into maint
* dgud/wx/fix-empty-binaries/OTP-14688:
Correct io_vec handling
-rw-r--r-- | lib/wx/c_src/wxe_driver.c | 23 |
1 files changed, 16 insertions, 7 deletions
diff --git a/lib/wx/c_src/wxe_driver.c b/lib/wx/c_src/wxe_driver.c index 5da71818e5..26ae3564e7 100644 --- a/lib/wx/c_src/wxe_driver.c +++ b/lib/wx/c_src/wxe_driver.c @@ -33,6 +33,7 @@ #include <sys/types.h> #include <fcntl.h> +#include <assert.h> #include "wxe_driver.h" #define TEMP_BINARY_SIZE 512 @@ -234,13 +235,21 @@ standard_outputv(ErlDrvData drv_data, ErlIOVec* ev) sd->max_bins = max; } - if(ev->vsize == 2) { - binref->base = ev->iov[1].iov_base; - binref->size = ev->iov[1].iov_len; - binref->from = driver_caller(sd->port_handle); - bin = ev->binv[1]; - driver_binary_inc_refc(bin); /* Otherwise it could get deallocated */ - binref->bin = bin; + if(ev->size > 0) { + assert(ev->vsize == 2 && ev->iov[0].iov_len == 0 + && "erts changed how the ErlIOVec is structured for outputv"); + binref->from = driver_caller(sd->port_handle); + binref->size = ev->iov[1].iov_len; + if(ev->binv[1]) { + binref->base = ev->iov[1].iov_base; + bin = ev->binv[1]; + driver_binary_inc_refc(bin); /* Otherwise it could get deallocated */ + } else { + bin = driver_alloc_binary(ev->iov[1].iov_len); + memcpy(bin->orig_bytes, ev->iov[1].iov_base, ev->iov[1].iov_len); + binref->base = bin->orig_bytes; + } + binref->bin = bin; } else { /* Empty binary (becomes NULL) */ binref->base = NULL; binref->size = 0; |