diff options
| author | Zheng Da <zhengda1936@gmail.com> | 2010-02-05 15:05:58 +0100 |
|---|---|---|
| committer | Zheng Da <zhengda1936@gmail.com> | 2010-02-05 15:05:58 +0100 |
| commit | ceabed7508dee4df3e40d1aeccd35c90115ae95c (patch) | |
| tree | be881fec840a95868c7481b434069d3dcf5f74e3 | |
| parent | 9b35bbf6dfccface4eb2878f0a45d158eadae511 (diff) | |
dereference ports when return D_INVALID_OPERATIONS in device requests.
| -rw-r--r-- | libmachdev/ds_routines.c | 35 |
1 files changed, 28 insertions, 7 deletions
diff --git a/libmachdev/ds_routines.c b/libmachdev/ds_routines.c index 9152c72e..c647b8e9 100644 --- a/libmachdev/ds_routines.c +++ b/libmachdev/ds_routines.c @@ -260,7 +260,10 @@ ds_device_write (device_t dev, mach_port_t reply_port, device = mach_convert_port_to_device (dev); if (! device->emul_ops->write) - return D_INVALID_OPERATION; + { + ports_port_deref (device_to_pi (device)); + return D_INVALID_OPERATION; + } ret = (*device->emul_ops->write) (device->emul_data, reply_port, reply_port_type, mode, recnum, @@ -290,7 +293,10 @@ ds_device_write_inband (device_t dev, mach_port_t reply_port, device = mach_convert_port_to_device (dev); if (! device->emul_ops->write_inband) - return D_INVALID_OPERATION; + { + ports_port_deref (device_to_pi (device)); + return D_INVALID_OPERATION; + } ret = (*device->emul_ops->write_inband) (device->emul_data, reply_port, reply_port_type, mode, recnum, @@ -316,7 +322,10 @@ ds_device_read (device_t dev, mach_port_t reply_port, device = mach_convert_port_to_device (dev); if (! device->emul_ops->read) - return D_INVALID_OPERATION; + { + ports_port_deref (device_to_pi (device)); + return D_INVALID_OPERATION; + } ret = (*device->emul_ops->read) (device->emul_data, reply_port, reply_port_type, mode, recnum, @@ -341,7 +350,10 @@ ds_device_read_inband (device_t dev, mach_port_t reply_port, device = mach_convert_port_to_device (dev); if (! device->emul_ops->read_inband) - return D_INVALID_OPERATION; + { + ports_port_deref (device_to_pi (device)); + return D_INVALID_OPERATION; + } ret = (*device->emul_ops->read_inband) (device->emul_data, reply_port, reply_port_type, mode, recnum, @@ -364,7 +376,10 @@ ds_device_set_status (device_t dev, dev_flavor_t flavor, device = mach_convert_port_to_device (dev); if (! device->emul_ops->set_status) - return D_INVALID_OPERATION; + { + ports_port_deref (device_to_pi (device)); + return D_INVALID_OPERATION; + } ret = (*device->emul_ops->set_status) (device->emul_data, flavor, status, status_count); @@ -386,7 +401,10 @@ ds_device_get_status (device_t dev, dev_flavor_t flavor, dev_status_t status, device = mach_convert_port_to_device (dev); if (! device->emul_ops->get_status) - return D_INVALID_OPERATION; + { + ports_port_deref (device_to_pi (device)); + return D_INVALID_OPERATION; + } ret = (*device->emul_ops->get_status) (device->emul_data, flavor, status, status_count); @@ -408,7 +426,10 @@ ds_device_set_filter (device_t dev, mach_port_t receive_port, int priority, device = mach_convert_port_to_device (dev); if (! device->emul_ops->set_filter) - return D_INVALID_OPERATION; + { + ports_port_deref (device_to_pi (device)); + return D_INVALID_OPERATION; + } ret = (*device->emul_ops->set_filter) (device->emul_data, receive_port, priority, filter, filter_count); |
