diff --git a/src/box/lua/call.cc b/src/box/lua/call.cc index ee5e3ad8c64c3b2acc283c51cdbb0ec2fb4a1d00..8c27328020cdb89423aa144ec6bee1be5a757473 100644 --- a/src/box/lua/call.cc +++ b/src/box/lua/call.cc @@ -240,7 +240,6 @@ port_ffi_create(struct port_ffi *port) port->vtab = &port_ffi_vtab; } - static inline void port_ffi_clear(struct port_ffi *port) { @@ -254,10 +253,7 @@ port_ffi_clear(struct port_ffi *port) void port_ffi_destroy(struct port_ffi *port) { - port_ffi_clear(port); free(port->ret); - port->ret = NULL; - port->capacity = 0; } int @@ -275,11 +271,20 @@ boxffi_select(struct port_ffi *port, uint32_t space_id, uint32_t index_id, request.key = key; request.key_end = key_end; + /* + * A single instance of port_ffi object is used + * for all selects, reset it. + */ port->size = 0; try { box_process(&request, (struct port *) port); return 0; } catch (Exception *e) { + /* + * The tuples will be not blessed and garbage + * collected, unreference them here, to avoid + * a leak. + */ port_ffi_clear(port); /* will be hanled by box.error() in Lua */ return -1;