From: Tom Tromey Date: Wed, 30 Jul 2025 14:30:49 +0000 (-0600) Subject: Emit DAPException when too many variable children are reqeusted X-Git-Tag: gdb-17-branchpoint~345 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=9ef3249a00f50ee00e3973e5901cd2936abc79b3;p=thirdparty%2Fbinutils-gdb.git Emit DAPException when too many variable children are reqeusted PR dap/33228 points out a failure that occurs when the DAP client requests more children of a variable than actually exist. Currently, gdb throws a somewhat confusing exception. This patch changes this code to throw a DAPException instead, resulting in a more ordinary and readable failure. The spec seems to be silent on what to do in this case. I chose an exception on the theory that it's easier to be strict now and lift the restriction later (if needed) than vice versa. Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=33228 --- diff --git a/gdb/python/lib/gdb/dap/varref.py b/gdb/python/lib/gdb/dap/varref.py index 8a13c51a452..1b54fe745fa 100644 --- a/gdb/python/lib/gdb/dap/varref.py +++ b/gdb/python/lib/gdb/dap/varref.py @@ -146,6 +146,10 @@ class BaseReference(ABC): if self._children is None: self._children = [None] * self.child_count() for idx in range(start, start + count): + if idx >= len(self._children): + raise DAPException( + f"requested child {idx} outside range of variable {self._ref}" + ) if self._children[idx] is None: (name, value) = self.fetch_one_child(idx) name = self._compute_name(name) diff --git a/gdb/testsuite/gdb.dap/scopes.exp b/gdb/testsuite/gdb.dap/scopes.exp index b2066e5276c..bce7746c12f 100644 --- a/gdb/testsuite/gdb.dap/scopes.exp +++ b/gdb/testsuite/gdb.dap/scopes.exp @@ -133,6 +133,13 @@ set refs [lindex [dap_check_request_and_response "fetch contents of dei" \ set deivals [dict get $refs body variables] gdb_assert {[llength $deivals] == 2} "dei has two members" +# Request more children than exist. See PR dap/33228. +set seq [dap_send_request variables \ + [format {o variablesReference [i %d] count [i 100]} $dei_ref]] +lassign [dap_read_response variables $seq] response ignore +gdb_assert {[dict get $response success] == "false"} \ + "variables with invalid count" + set num [dict get $reg_scope variablesReference] lassign [dap_check_request_and_response "fetch all registers" \ "variables" \