From: Simon Marchi via Gdb-patches <gdb-patches@sourceware.org>
To: Andrew Burgess <andrew.burgess@embecosm.com>,
Simon Marchi <simon.marchi@efficios.com>
Cc: gdb-patches@sourceware.org
Subject: Re: [PATCH 2/4] gdb: make remote target clear its async event handler in wait
Date: Thu, 24 Dec 2020 12:44:39 -0500 [thread overview]
Message-ID: <214e12e4-14cf-9bf6-f54c-128843eb3126@polymtl.ca> (raw)
In-Reply-To: <20201224172318.GP2945@embecosm.com>
On 2020-12-24 12:23 p.m., Andrew Burgess wrote:
> * Simon Marchi via Gdb-patches <gdb-patches@sourceware.org> [2020-11-30 11:52:49 -0500]:
>
>> The remote target's remote_async_inferior_event_token field is a flag
>> that tells when it has an event to report and it wants its wait method
>> to be called so it can report it. The flag in cleared the
>
> "The flag is cleared in the ...."
Fixed.
>> @@ -8009,11 +8016,10 @@ remote_target::wait (ptid_t ptid, struct target_waitstatus *status,
>>
>> if (target_is_async_p ())
>> {
>> - remote_state *rs = get_remote_state ();
>> -
>> /* If there are are events left in the queue tell the event loop
>> to return here. */
>
> It feels like this comment should be updated something like:
>
> /* If there are events left in the queue, or unacknowledged
> notifications, then tell the event loop to return here. */
Done. I also changed "to return here" to "to call us again", because
I thought "to return here" was not very clear.
>
>> - if (!rs->stop_reply_queue.empty ())
>> + if (!rs->stop_reply_queue.empty ()
>> + || rs->notif_state->pending_event[notif_client_stop.id] != nullptr)
>> mark_async_event_handler (rs->remote_async_inferior_event_token);
>> }
>>
>> @@ -14174,21 +14180,7 @@ remote_async_serial_handler (struct serial *scb, void *context)
>> static void
>> remote_async_inferior_event_handler (gdb_client_data data)
>> {
>> - remote_target *remote = (remote_target *) data;
>> - remote_state *rs = remote->get_remote_state ();
>> - clear_async_event_handler (rs->remote_async_inferior_event_token);
>> -
>> inferior_event_handler (INF_REG_EVENT);
>> -
>> - /* inferior_event_handler may have consumed an event pending on the
>> - infrun side without calling target_wait on the REMOTE target, or
>> - may have pulled an event out of a different target. Keep trying
>> - for this remote target as long it still has either pending events
>> - or unacknowledged notifications. */
>> -
>> - if (rs->notif_state->pending_event[notif_client_stop.id] != NULL
>> - || !rs->stop_reply_queue.empty ())
>> - mark_async_event_handler (rs->remote_async_inferior_event_token);
>
> This code was all from commit 96118d114e3c5. If you check that commit
> for the file remote.c you'll see one extra hunk:
>
> diff --git a/gdb/remote.c b/gdb/remote.c
> index f7f99dc24fe..59075cb09f2 100644
> --- a/gdb/remote.c
> +++ b/gdb/remote.c
> @@ -5605,7 +5605,7 @@ remote_target::open_1 (const char *name, int from_tty, int extended_p)
>
> /* Register extra event sources in the event loop. */
> rs->remote_async_inferior_event_token
> - = create_async_event_handler (remote_async_inferior_event_handler, NULL);
> + = create_async_event_handler (remote_async_inferior_event_handler, remote);
> rs->notif_state = remote_notif_state_allocate (remote);
>
> /* Reset the target state; these things will be queried either by
>
> I think this should be reverted as part of this commit too. Passing
> the remote through as the gdb_client_data parameter is bad
> (i.e. allows for use after free situations), so lets not do that.
I don't think this is specifically what lead to the use-after-free, it was
more that we referred to the remote target after calling fetch_inferior_event.
But I agree that since it's now unused, we should not pass it anymore, so fixed.
> Otherwise, LGTM.
Thanks, I'll wait a bit to see if Pedro also has something to say about it.
Simon
next prev parent reply other threads:[~2020-12-24 17:44 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-11-30 16:52 [PATCH 0/4] Clear target async event handlers in wait method Simon Marchi via Gdb-patches
2020-11-30 16:52 ` [PATCH 1/4] gdb: make async event handlers clear themselves Simon Marchi via Gdb-patches
2020-12-24 17:26 ` Andrew Burgess
2021-02-04 17:42 ` Pedro Alves
2021-02-04 18:15 ` Simon Marchi via Gdb-patches
2020-11-30 16:52 ` [PATCH 2/4] gdb: make remote target clear its async event handler in wait Simon Marchi via Gdb-patches
2020-12-24 17:23 ` Andrew Burgess
2020-12-24 17:44 ` Simon Marchi via Gdb-patches [this message]
2021-02-04 18:00 ` Pedro Alves
2021-02-04 18:34 ` Simon Marchi via Gdb-patches
2020-11-30 16:52 ` [PATCH 3/4] gdb: make record-btrace " Simon Marchi via Gdb-patches
2021-01-06 9:50 ` Andrew Burgess
2020-11-30 16:52 ` [PATCH 4/4] gdb: make record-full " Simon Marchi via Gdb-patches
2021-01-06 9:51 ` Andrew Burgess
2020-12-23 21:31 ` [PATCH 0/4] Clear target async event handlers in wait method Simon Marchi via Gdb-patches
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=214e12e4-14cf-9bf6-f54c-128843eb3126@polymtl.ca \
--to=gdb-patches@sourceware.org \
--cc=andrew.burgess@embecosm.com \
--cc=simon.marchi@efficios.com \
--cc=simon.marchi@polymtl.ca \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox