[PATCH v2 2/2] testsuite, mi: prevent buffer overflow in get_mi_thread_list
Aktemur, Tankut Baris
tankut.baris.aktemur@intel.com
Tue Apr 2 08:54:56 GMT 2024
Kindly pinging.
Thanks
-Baris
On Thursday, February 29, 2024 4:49 PM, Aktemur, Tankut Baris wrote:
> 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
More information about the Gdb-patches
mailing list