summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorErlang/OTP <otp@erlang.org>2023-04-20 14:11:10 +0200
committerErlang/OTP <otp@erlang.org>2023-04-20 14:11:10 +0200
commit8f77727e7a89b61c7a53d9e615b19a02a5937b4c (patch)
tree424b5d907b2e131b886e5d0d11c846ce97448cfd
parent9d378933e266fe5b1ef760cfdea51e370ab6f643 (diff)
parent7b74c04ded2172a286a38063dad1f5e9f2431bf0 (diff)
downloaderlang-8f77727e7a89b61c7a53d9e615b19a02a5937b4c.tar.gz
Merge branch 'rickard/driver-call-callback-fix/24.3.4/OTP-18525' into maint-24
* rickard/driver-call-callback-fix/24.3.4/OTP-18525: [erts] Fix error case for driver call callback
-rw-r--r--erts/emulator/beam/io.c44
1 files changed, 28 insertions, 16 deletions
diff --git a/erts/emulator/beam/io.c b/erts/emulator/beam/io.c
index 7a8aeee304..13c46899ed 100644
--- a/erts/emulator/beam/io.c
+++ b/erts/emulator/beam/io.c
@@ -4628,6 +4628,7 @@ erts_port_call(Process* c_p,
unsigned ret_flags = 0U;
Eterm term;
Eterm* hp;
+ ErtsPortOpResult result;
res = call_driver_call(c_p->common.id,
prt,
@@ -4641,25 +4642,36 @@ erts_port_call(Process* c_p,
finalize_imm_drv_call(&try_call_state);
if (bufp != &input_buf[0])
erts_free(ERTS_ALC_T_TMP, bufp);
- if (res == ERTS_PORT_OP_BADARG)
- return ERTS_PORT_OP_BADARG;
- hsz = erts_decode_ext_size((byte *) resp_bufp, resp_size);
- if (hsz < 0)
- return ERTS_PORT_OP_BADARG;
- hsz += 3;
- erts_factory_proc_prealloc_init(&factory, c_p, hsz);
- endp = (byte *) resp_bufp;
- term = erts_decode_ext(&factory, (const byte**)&endp, 0);
- if (term == THE_NON_VALUE)
- return ERTS_PORT_OP_BADARG;
- hp = erts_produce_heap(&factory,3,0);
- *retvalp = TUPLE2(hp, am_ok, term);
- erts_factory_close(&factory);
+ if (res == ERTS_PORT_OP_BADARG) {
+ result = ERTS_PORT_OP_BADARG;
+ }
+ else {
+ hsz = erts_decode_ext_size((byte *) resp_bufp, resp_size);
+ if (hsz < 0) {
+ result = ERTS_PORT_OP_BADARG;
+ }
+ else {
+ hsz += 3;
+ erts_factory_proc_prealloc_init(&factory, c_p, hsz);
+ endp = (byte *) resp_bufp;
+ term = erts_decode_ext(&factory, (const byte**)&endp, 0);
+ if (term == THE_NON_VALUE) {
+ result = ERTS_PORT_OP_BADARG;
+ }
+ else {
+ hp = erts_produce_heap(&factory,3,0);
+ *retvalp = TUPLE2(hp, am_ok, term);
+ result = ERTS_PORT_OP_DONE;
+ }
+ erts_factory_close(&factory);
+ }
+ }
if (resp_bufp != &resp_buf[0]
- && !(ret_flags & DRIVER_CALL_KEEP_BUFFER))
+ && !(ret_flags & DRIVER_CALL_KEEP_BUFFER)) {
driver_free(resp_bufp);
+ }
BUMP_REDS(c_p, ERTS_PORT_REDS_CALL);
- return ERTS_PORT_OP_DONE;
+ return result;
}
case ERTS_TRY_IMM_DRV_CALL_INVALID_PORT:
if (bufp != &input_buf[0])