diff options
author | Justus Winter <4winter@informatik.uni-hamburg.de> | 2015-01-20 20:01:43 +0100 |
---|---|---|
committer | Justus Winter <4winter@informatik.uni-hamburg.de> | 2015-01-20 20:30:29 +0100 |
commit | 508221b49ae825501882e228b18e4586e59e88b0 (patch) | |
tree | 9c431365801153648d91fceb130ae03912f729ce /console | |
parent | 1ad178fd00b675d686c2560829e9a10c5cb44f6f (diff) |
console: fix error and notification port handling
This fixes a deallocation of an invalid port notably seen on system
shutdown.
* console/display.c (free_modreqs): Handle errors of
`mach_port_request_notification' and check whether the old
notification port was valid.
(do_mach_notify_msg_accepted): Likewise.
(display_notice_filechange): Likewise.
Diffstat (limited to 'console')
-rw-r--r-- | console/display.c | 37 |
1 files changed, 22 insertions, 15 deletions
diff --git a/console/display.c b/console/display.c index 09add5c6..eb420fd1 100644 --- a/console/display.c +++ b/console/display.c @@ -298,16 +298,18 @@ nowait_file_changed (mach_port_t notify_port, natural_t tickno, static void free_modreqs (struct modreq *mr) { + error_t err; struct modreq *tmp; for (; mr; mr = tmp) { mach_port_t old; /* Cancel the dead-name notification. */ - mach_port_request_notification (mach_task_self (), mr->port, - MACH_NOTIFY_DEAD_NAME, 0, - MACH_PORT_NULL, - MACH_MSG_TYPE_MAKE_SEND_ONCE, &old); - mach_port_deallocate (mach_task_self (), old); + err = mach_port_request_notification (mach_task_self (), mr->port, + MACH_NOTIFY_DEAD_NAME, 0, + MACH_PORT_NULL, + MACH_MSG_TYPE_MAKE_SEND_ONCE, &old); + if (! err && MACH_PORT_VALID (old)) + mach_port_deallocate (mach_task_self(), old); /* Deallocate the user's port. */ mach_port_deallocate (mach_task_self (), mr->port); @@ -438,16 +440,19 @@ do_mach_notify_msg_accepted (struct port_info *pi, mach_port_t send) notify_port->pi.port_right); if (err && err != MACH_SEND_WILL_NOTIFY) { + error_t e; mach_port_t old; *preq = req->next; pthread_mutex_unlock (&display->lock); - /* Cancel the dead-name notification. */ - mach_port_request_notification (mach_task_self (), req->port, - MACH_NOTIFY_DEAD_NAME, 0, - MACH_PORT_NULL, - MACH_MSG_TYPE_MAKE_SEND_ONCE, &old); - mach_port_deallocate (mach_task_self (), old); + /* Cancel the dead-name notification. */ + e = mach_port_request_notification (mach_task_self (), req->port, + MACH_NOTIFY_DEAD_NAME, 0, + MACH_PORT_NULL, + MACH_MSG_TYPE_MAKE_SEND_ONCE, + &old); + if (! e && MACH_PORT_VALID (old)) + mach_port_deallocate (mach_task_self(), old); mach_port_deallocate (mach_task_self (), req->port); free (req); @@ -564,13 +569,15 @@ display_notice_filechange (display_t display) } else { + error_t e; mach_port_t old; /* Cancel the dead-name notification. */ - mach_port_request_notification (mach_task_self (), req->port, - MACH_NOTIFY_DEAD_NAME, 0, - MACH_PORT_NULL, 0, &old); - mach_port_deallocate (mach_task_self (), old); + e = mach_port_request_notification (mach_task_self (), req->port, + MACH_NOTIFY_DEAD_NAME, 0, + MACH_PORT_NULL, 0, &old); + if (! e && MACH_PORT_VALID (old)) + mach_port_deallocate (mach_task_self(), old); mach_port_deallocate (mach_task_self (), req->port); free (req); } |