summaryrefslogtreecommitdiff
path: root/device
diff options
context:
space:
mode:
authorSamuel Thibault <samuel.thibault@ens-lyon.org>2020-07-19 14:18:16 +0200
committerSamuel Thibault <samuel.thibault@ens-lyon.org>2020-07-19 14:19:40 +0200
commit100eb9e53f441a1d6c6e7db55f735778d67bf504 (patch)
tree1d3f28c009ce787db9d9d962e0a941f0978cf0c1 /device
parent9e960ca99381dad4d1b75ad56842a5b5c3e41235 (diff)
device intr: Fix reference leak
On RPC success we have to release the passed send rights, otherwise references accumulate and we never notice when the receiver dies. * device/ds_routines.c (ds_device_intr_ack): On success, call ipc_port_release_send on the notification receive port.
Diffstat (limited to 'device')
-rw-r--r--device/ds_routines.c8
1 files changed, 7 insertions, 1 deletions
diff --git a/device/ds_routines.c b/device/ds_routines.c
index 681f6260..e94e5ca8 100644
--- a/device/ds_routines.c
+++ b/device/ds_routines.c
@@ -367,6 +367,7 @@ ds_device_intr_ack (device_t dev, ipc_port_t receive_port)
return D_INVALID_OPERATION;
#else /* MACH_XEN || __x86_64__ */
mach_device_t mdev = dev->emul_data;
+ kern_return_t ret;
/* Refuse if device is dead or not completely open. */
if (dev == DEVICE_NULL)
@@ -376,7 +377,12 @@ ds_device_intr_ack (device_t dev, ipc_port_t receive_port)
if (! name_equal(mdev->dev_ops->d_name, 3, "irq"))
return D_INVALID_OPERATION;
- return irq_acknowledge(receive_port);
+ ret = irq_acknowledge(receive_port);
+
+ if (ret == D_SUCCESS)
+ ipc_port_release_send(receive_port);
+
+ return ret;
#endif /* MACH_XEN || __x86_64__ */
}