From patchwork Sat Jan 11 20:30:36 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Simon Marchi X-Patchwork-Id: 104591 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 912613858432 for ; Sat, 11 Jan 2025 20:31:50 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 912613858432 Authentication-Results: sourceware.org; dkim=pass (1024-bit key, unprotected) header.d=polymtl.ca header.i=@polymtl.ca header.a=rsa-sha256 header.s=default header.b=uhz0nQ5a X-Original-To: gdb-patches@sourceware.org Delivered-To: gdb-patches@sourceware.org Received: from smtp.polymtl.ca (smtp.polymtl.ca [132.207.4.11]) by sourceware.org (Postfix) with ESMTPS id F13DA3858D3C; Sat, 11 Jan 2025 20:31:13 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org F13DA3858D3C Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=polymtl.ca Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=polymtl.ca ARC-Filter: OpenARC Filter v1.0.0 sourceware.org F13DA3858D3C Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=132.207.4.11 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1736627474; cv=none; b=otzTKetRmpCbEhlBL/bjOQDvZRkjYNXUfSIJnqjGxqKcaHYp6cVwkzJIWtY+gTxNHsRrEQQXBQlv7HLYkRmRM1T64DjGr1nX+/wK2NeNCc6+PtogxGQZiH3R7hDyQPrpjV5mcRua41/FvAT7KFeW3GIerJzFQiYUPqzBbqQbJYM= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1736627474; c=relaxed/simple; bh=JH1qQEx5SUqS2k+SaaSiXzMUzfdsSl45PHZqPWWKzL8=; h=DKIM-Signature:From:To:Subject:Date:Message-ID:MIME-Version; b=f3iQxnhzoh1FzEbAXAx5suMnCikj/fijFw3h6m0nGkUdnYahip4or0JV4IP6bPvUceInS67mmTFCGxLuFbETeUIzJz9nw+Sqg9X77ywaXDDUe/yOOxApF040FlMRS/d1fFmaalp/ZuKm+03Z2/70l7LbzocoZ1JJG28jX0xMwWA= ARC-Authentication-Results: i=1; server2.sourceware.org DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org F13DA3858D3C Received: from simark.ca (simark.ca [158.69.221.121]) (authenticated bits=0) by smtp.polymtl.ca (8.14.7/8.14.7) with ESMTP id 50BKV8Os098755 (version=TLSv1/SSLv3 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Sat, 11 Jan 2025 15:31:13 -0500 DKIM-Filter: OpenDKIM Filter v2.11.0 smtp.polymtl.ca 50BKV8Os098755 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=polymtl.ca; s=default; t=1736627473; bh=sWMDl1vXrS22RtKd28TBML90rxhoMTcETJDuYMstBdA=; h=From:To:Cc:Subject:Date:In-Reply-To:From; b=uhz0nQ5amjM7JyE+s/5xOBgUj07ybcI4c8v2c4jXTlCwq6+eZN3VB+GOgRFKErLnO qxwQ0KCsolJOyJiBbksxGHDTsYnTXvek9LNsMEhCjfe9Ud4Gw9UemfFyZKUwsu8c3Z jrqwk2WxGG0hhfJQTWiOEfbyZ1I2Rvb0545948iU= Received: by simark.ca (Postfix, from userid 112) id 51DF61E0C0; Sat, 11 Jan 2025 15:31:08 -0500 (EST) X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-Spam-Level: X-Spam-Status: No, score=-3188.1 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, RCVD_IN_MSPIKE_H3, RCVD_IN_MSPIKE_WL, SPF_HELO_PASS, SPF_NONE, TXREP, WEIRD_PORT autolearn=ham autolearn_force=no version=3.4.6 Received: from simark.localdomain (modemcable238.237-201-24.mc.videotron.ca [24.201.237.238]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (prime256v1) server-digest SHA256) (No client certificate requested) by simark.ca (Postfix) with ESMTPSA id 23C511E05C; Sat, 11 Jan 2025 15:31:07 -0500 (EST) From: simon.marchi@polymtl.ca To: gdb-patches@sourceware.org Cc: Thiago Jung Bauermann , GDB Administrator Subject: [PATCH v2] gdb/jit: use correctly-sized array view in deprecated_frame_register_read call Date: Sat, 11 Jan 2025 15:30:36 -0500 Message-ID: <20250111203106.668665-1-simon.marchi@polymtl.ca> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20250111044535.292946-1-simon.marchi@polymtl.ca> References: <20250111044535.292946-1-simon.marchi@polymtl.ca> MIME-Version: 1.0 X-Poly-FromMTA: (simark.ca [158.69.221.121]) at Sat, 11 Jan 2025 20:31:08 +0000 X-BeenThere: gdb-patches@sourceware.org X-Mailman-Version: 2.1.30 Precedence: list List-Id: Gdb-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: gdb-patches-bounces~patchwork=sourceware.org@sourceware.org From: GDB Administrator New in v2: - modify gdb/jit-reader.in, instead of the generated file. Commit 7fcdec025c05 ("GDB: Use gdb::array_view for buffers used in register reading and unwinding") introduces a regression in gdb.base/jit-reader.exp: $ ./gdb -q -nx --data-directory=data-directory testsuite/outputs/gdb.base/jit-reader/jit-reader -ex 'jit-reader-load /home/simark/build/binutils-gdb/gdb/testsuite/outputs/gdb.base/jit-reader/jit-reader.so' -ex r -batch This GDB supports auto-downloading debuginfo from the following URLs: Enable debuginfod for this session? (y or [n]) [answered N; input not from terminal] Debuginfod has been disabled. To make this setting permanent, add 'set debuginfod enabled off' to .gdbinit. [Thread debugging using libthread_db enabled] Using host libthread_db library "/usr/lib/../lib/libthread_db.so.1". Program received signal SIGTRAP, Trace/breakpoint trap. Recursive internal problem. The "Recusive internal problem" part is not good, but it's not the point of this patch. It still means we hit an internal error. The stack trace is: #0 internal_error_loc (file=0x55555ebefb20 "/home/simark/src/binutils-gdb/gdb/frame.c", line=1207, fmt=0x55555ebef500 "%s: Assertion `%s' failed.") at /home/simark/src/binutils-gdb/gdbsupport/errors.cc:53 #1 0x0000555561604d83 in frame_register_unwind (next_frame=..., regnum=16, optimizedp=0x7ffff12e5a20, unavailablep=0x7ffff12e5a30, lvalp=0x7ffff12e5a40, addrp=0x7ffff12e5a60, realnump=0x7ffff12e5a50, buffer=...) at /home/simark/src/binutils-gdb/gdb/frame.c:1207 #2 0x0000555561608334 in deprecated_frame_register_read (frame=..., regnum=16, myaddr=...) at /home/simark/src/binutils-gdb/gdb/frame.c:1496 #3 0x0000555561a74259 in jit_unwind_reg_get_impl (cb=0x7ffff1049ca0, regnum=16) at /home/simark/src/binutils-gdb/gdb/jit.c:988 #4 0x00007fffd26e634e in read_register (callbacks=0x7ffff1049ca0, dw_reg=16, value=0x7fffffffb4c8) at /home/simark/src/binutils-gdb/gdb/testsuite/gdb.base/jit-reader.c:100 #5 0x00007fffd26e645f in unwind_frame (self=0x50400000ac10, cbs=0x7ffff1049ca0) at /home/simark/src/binutils-gdb/gdb/testsuite/gdb.base/jit-reader.c:143 #6 0x0000555561a74a12 in jit_frame_sniffer (self=0x55556374d040 , this_frame=..., cache=0x5210002905f8) at /home/simark/src/binutils-gdb/gdb/jit.c:1042 #7 0x00005555615f499e in frame_unwind_try_unwinder (this_frame=..., this_cache=0x5210002905f8, unwinder=0x55556374d040 ) at /home/simark/src/binutils-gdb/gdb/frame-unwind.c:138 #8 0x00005555615f512c in frame_unwind_find_by_frame (this_frame=..., this_cache=0x5210002905f8) at /home/simark/src/binutils-gdb/gdb/frame-unwind.c:209 #9 0x00005555616178d0 in get_frame_type (frame=...) at /home/simark/src/binutils-gdb/gdb/frame.c:2996 #10 0x000055556282db03 in do_print_frame_info (uiout=0x511000027500, fp_opts=..., frame=..., print_level=0, print_what=SRC_AND_LOC, print_args=1, set_current_sal=1) at /home/simark/src/binutils-gdb/gdb/stack.c:1033 The problem is that function `jit_unwind_reg_get_impl` passes field `gdb_reg_value::value`, a gdb_byte array of 1 element (used as a flexible array member), as the array view parameter of `deprecated_frame_register_read`. This results in an array view of size 1. The assertion in `frame_register_unwind` that verifies the passed in buffer is larger enough to hold the unwound register value then fails. Fix this by explicitly creating an array view of the right size. At the same time, remove the `1` in the array definition, which would have avoided this bug (it wouldn't have compiled). Change-Id: Ie170da438ec9085863e7be8b455a067b531635dc Reviewed-by: Thiago Jung Bauermann --- gdb/jit-reader.in | 2 +- gdb/jit.c | 9 +++++---- 2 files changed, 6 insertions(+), 5 deletions(-) base-commit: 4d7100dc04c44bee73ca6c45c69f6b20d89a67c8 diff --git a/gdb/jit-reader.in b/gdb/jit-reader.in index 3dc8a5bd8554..b32affc561e6 100644 --- a/gdb/jit-reader.in +++ b/gdb/jit-reader.in @@ -208,7 +208,7 @@ struct gdb_reg_value gdb_reg_value_free *free; /* The value of the register. */ - unsigned char value[1]; + unsigned char value[]; }; /* get_frame_id in gdb_reader_funcs is to return a gdb_frame_id diff --git a/gdb/jit.c b/gdb/jit.c index 4b9400ab2f8e..822ffb4ffe83 100644 --- a/gdb/jit.c +++ b/gdb/jit.c @@ -983,10 +983,11 @@ jit_unwind_reg_get_impl (struct gdb_unwind_callbacks *cb, int regnum) gdb_reg = gdbarch_dwarf2_reg_to_regnum (frame_arch, regnum); size = register_size (frame_arch, gdb_reg); - value = ((struct gdb_reg_value *) - xmalloc (sizeof (struct gdb_reg_value) + size - 1)); - value->defined = deprecated_frame_register_read (priv->this_frame, gdb_reg, - value->value); + value = XNEWVAR (gdb_reg_value, sizeof (gdb_reg_value) + size); + value->defined + = deprecated_frame_register_read (priv->this_frame, gdb_reg, + gdb::make_array_view (value->value, + size)); value->size = size; value->free = reg_value_free_impl; return value;