From: Tankut Baris Aktemur <tankut.baris.aktemur@intel.com>
To: gdb-patches@sourceware.org
Subject: [PATCH v2 2/2] testsuite, mi: prevent buffer overflow in get_mi_thread_list
Date: Thu, 29 Feb 2024 16:49:06 +0100 [thread overview]
Message-ID: <20240229154906.3354860-2-tankut.baris.aktemur@intel.com> (raw)
In-Reply-To: <20240229154906.3354860-1-tankut.baris.aktemur@intel.com>
For the first version of this patch, Linaro's bot reported regression:
https://ci.linaro.org/job/tcwg_gdb_check--master-arm-precommit/1788/artifact/artifacts/artifacts.precommit/notify/mail-body.txt
I cannot reproduce the failure locally. In this revision, I added the
"-prompt" flag to gdb_test_multiple. Hopefully that will help address
the failure reported by the bot.
The first version is available at
https://sourceware.org/pipermail/gdb-patches/2024-February/206885.html
Regards,
Baris
=================================
If there is a large number of threads in the input program, the
expect buffer in `get_mi_thread_list` would become full. Prevent this
by consuming the buffer in small pieces.
---
gdb/testsuite/lib/mi-support.exp | 52 +++++++++++++++++---------------
1 file changed, 28 insertions(+), 24 deletions(-)
diff --git a/gdb/testsuite/lib/mi-support.exp b/gdb/testsuite/lib/mi-support.exp
index 33a3a71b396..6862b831c07 100644
--- a/gdb/testsuite/lib/mi-support.exp
+++ b/gdb/testsuite/lib/mi-support.exp
@@ -1953,39 +1953,43 @@ proc mi_run_inline_test { testcase } {
}
proc get_mi_thread_list {name} {
- global expect_out
+ global expect_out decimal mi_gdb_prompt
# MI will return a list of thread ids:
#
# -thread-list-ids
- # ^done,thread-ids=[thread-id="1",thread-id="2",...],number-of-threads="N"
+ # ^done,thread-ids={thread-id="1",thread-id="2",...},number-of-threads="N"
# (gdb)
- mi_gdb_test "-thread-list-ids" \
- {.*\^done,thread-ids={(thread-id="[0-9]+"(,)?)+},current-thread-id="[0-9]+",number-of-threads="[0-9]+"} \
- "-thread_list_ids ($name)"
-
- set output {}
- if {[info exists expect_out(buffer)]} {
- set output $expect_out(buffer)
- }
-
+ #
+ # In case there are too many threads, the expect buffer would
+ # become full. Process the buffer contents in small chunks.
set thread_list {}
- if {![regexp {thread-ids=\{(thread-id="[0-9]+"(,)?)*\}} $output threads]} {
- fail "finding threads in MI output ($name)"
- } else {
- pass "finding threads in MI output ($name)"
-
- # Make list of console threads
- set start [expr {[string first \{ $threads] + 1}]
- set end [expr {[string first \} $threads] - 1}]
- set threads [string range $threads $start $end]
- foreach thread [split $threads ,] {
- if {[scan $thread {thread-id="%d"} num]} {
- lappend thread_list $num
- }
+ set num_threads "unknown"
+ set test "$name: get mi thread list"
+ gdb_test_multiple "-thread-list-ids" $test -prompt "$mi_gdb_prompt" {
+ -re "done,thread-ids=\{" {
+ exp_continue
+ }
+ -re "^thread-id=\"($decimal)\"(,|\})" {
+ set num $expect_out(1,string)
+ lappend thread_list $num
+ exp_continue
+ }
+ -re "^,current-thread-id=\"$decimal\"" {
+ exp_continue
+ }
+ -re "^,number-of-threads=\"($decimal)\"" {
+ set num_threads $expect_out(1,string)
+ exp_continue
+ }
+ -re "^\r\n$mi_gdb_prompt" {
+ pass $gdb_test_name
}
}
+ gdb_assert {[llength $thread_list] == $num_threads} \
+ "$name: found thread ids in MI output"
+
return $thread_list
}
--
2.34.1
Intel Deutschland GmbH
Registered Address: Am Campeon 10, 85579 Neubiberg, Germany
Tel: +49 89 99 8853-0, www.intel.de <http://www.intel.de>
Managing Directors: Christin Eisenschmid, Sharon Heck, Tiffany Doon Silva
Chairperson of the Supervisory Board: Nicole Lau
Registered Office: Munich
Commercial Register: Amtsgericht Muenchen HRB 186928
next prev parent reply other threads:[~2024-02-29 15:49 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-02-29 15:49 [PATCH v2 1/2] testsuite, mi: fix indentation " Tankut Baris Aktemur
2024-02-29 15:49 ` Tankut Baris Aktemur [this message]
2024-04-02 8:54 ` [PATCH v2 2/2] testsuite, mi: prevent buffer overflow " Aktemur, Tankut Baris
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=20240229154906.3354860-2-tankut.baris.aktemur@intel.com \
--to=tankut.baris.aktemur@intel.com \
--cc=gdb-patches@sourceware.org \
/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;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).