[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH hurd 1/2] console: fix error and notification port handling
From: |
Samuel Thibault |
Subject: |
Re: [PATCH hurd 1/2] console: fix error and notification port handling |
Date: |
Tue, 20 Jan 2015 21:33:56 +0100 |
User-agent: |
Mutt/1.5.21+34 (58baf7c9f32f) (2010-12-30) |
Justus Winter, le Tue 20 Jan 2015 20:30:58 +0100, a écrit :
> This fixes a deallocation of an invalid port notably seen on system
> shutdown.
Ack, thanks!
> * 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.
> ---
> console/display.c | 37 ++++++++++++++++++++++---------------
> 1 file changed, 22 insertions(+), 15 deletions(-)
>
> diff --git a/console/display.c b/console/display.c
> index 09add5c..eb420fd 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);
> }
> --
> 2.1.4
>
--
Samuel
/* Halley */
(Halley's comment.)