From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from simark.ca by simark.ca with LMTP id 8S2TKl4zBmjqKj4AWB0awg (envelope-from ) for ; Mon, 21 Apr 2025 08:00:30 -0400 Authentication-Results: simark.ca; dkim=pass (2048-bit key; unprotected) header.d=syntacore.com header.i=@syntacore.com header.a=rsa-sha256 header.s=m header.b=M5qoVp3f; dkim-atps=neutral Received: by simark.ca (Postfix, from userid 112) id 9A7281E0C0; Mon, 21 Apr 2025 08:00:30 -0400 (EDT) X-Spam-Checker-Version: SpamAssassin 4.0.1 (2024-03-25) on simark.ca X-Spam-Level: X-Spam-Status: No, score=-6.4 required=5.0 tests=ARC_SIGNED,ARC_VALID,BAYES_00, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,MAILING_LIST_MULTI, RCVD_IN_DNSWL_MED,RCVD_IN_MSPIKE_H2 autolearn=ham autolearn_force=no version=4.0.1 Received: from server2.sourceware.org (server2.sourceware.org [8.43.85.97]) (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 ESMTPS id 28B591E0C0 for ; Mon, 21 Apr 2025 08:00:27 -0400 (EDT) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id A2ED73858C62 for ; Mon, 21 Apr 2025 12:00:26 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org A2ED73858C62 Authentication-Results: sourceware.org; dkim=pass (2048-bit key, unprotected) header.d=syntacore.com header.i=@syntacore.com header.a=rsa-sha256 header.s=m header.b=M5qoVp3f Received: from m.syntacore.com (m.syntacore.com [178.249.69.228]) by sourceware.org (Postfix) with ESMTPS id 49B293858D29 for ; Mon, 21 Apr 2025 11:59:50 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 49B293858D29 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=syntacore.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=syntacore.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 49B293858D29 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=178.249.69.228 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1745236790; cv=none; b=xUYBfxPtBksbIzqihv1A55pnMIW38YZwEpQvPbOTEd+wHzGlAYbRlZ0BrYXxHLiyfywmLWDiAB0wb6+3q4r0ZIORhvLxYGitK6Wm2V0KhGxBS5Z531hHpQbe+md40hmorQis/e9UVjA9Xbmm1W7pjYYqFeaaGEFfL5GgnjwQ5Gs= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1745236790; c=relaxed/simple; bh=N2MuTXKnmp5dLoGT8O1dwun3iiIksfE/laUEqDsxbcc=; h=DKIM-Signature:From:To:Subject:Date:Message-ID:MIME-Version; b=atwEC0oGQTUa7MUv4mfURWMWTmePRheAJAL8i9jBLHc2zJ9CjXeK0dXmPfA1lyIdEyZET7sjC9alyXM2hJje87Kwt9cahC627XH8wMj+zSrxfD1xeZEa8BdDhDgMxncTzWSNRc2TqcpMaJadD/qNEFefIK8FBv/ETM7GTFinsfM= ARC-Authentication-Results: i=1; server2.sourceware.org DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 49B293858D29 Received: from pmg.syntacore.com (localhost.localdomain [127.0.0.1]) by m.syntacore.com (Proxmox) with ESMTP id 733F6B41C81 for ; Mon, 21 Apr 2025 14:59:48 +0300 (MSK) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=syntacore.com; h=cc:cc:content-transfer-encoding:content-type:content-type :date:from:from:message-id:mime-version:reply-to:subject:subject :to:to; s=m; bh=jqnkCHXIjT3Iq18oHHa97LsH9+Ya1Vn5HxXI1o6JjtQ=; b= M5qoVp3f6xSWbM7Xx+G2ZmR0EwVY9WZoTyN71dXAwLSEiIVEvA1j5YilFHkOzLGg jwxq7Yh/TfCE0Nss+w4Y2DSmD5A8DTGSp+eOG17mah8E/Mux4yarClNXmywkgdh4 Nl+oi+uKwaFOCewyWSi4WUm8T4uBz4Jv+2qC1iFTKwvVShNY+edLUGYbyyYkJNEz dpMLhNoKQvDndVeRFzjUqr/LYe5kfM9wUNJJZXVP4yjAMz31ugAker1d/lanCNsg Gsduo0UEQFFJExlxbk/bwb2es0On1oNR55wcTzrifYmINBE47hN8Jy2dLebXYwDQ 3VuIqb01AE4kkXN6qrxG4w== Received: from S-SC-EXCH-01.corp.syntacore.com (exchange.syntacore.com [10.76.202.20]) by m.syntacore.com (Proxmox) with ESMTPS id 5DEA1B41C03 for ; Mon, 21 Apr 2025 14:59:48 +0300 (MSK) Received: from kr-sc-ThinkPad-E14-Gen-2.yadro.com (172.17.13.100) by S-SC-EXCH-01.corp.syntacore.com (10.76.202.20) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.1544.11; Mon, 21 Apr 2025 14:58:25 +0300 From: Kirill Radkin To: CC: Kirill Radkin Subject: [PATCH] gdbserver: Update require_int function to parse offset for pread packet Date: Mon, 21 Apr 2025 14:59:41 +0300 Message-ID: <20250421115941.62567-1-kirill.radkin@syntacore.com> X-Mailer: git-send-email 2.43.0 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain X-Originating-IP: [172.17.13.100] X-ClientProxiedBy: S-SC-EXCH-01.corp.syntacore.com (10.76.202.20) To S-SC-EXCH-01.corp.syntacore.com (10.76.202.20) 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~public-inbox=simark.ca@sourceware.org Currently gdbserver uses require_int() function to parse the requested offset (in vFile::pread packet and the like). This function allows integers up to 0x7fffffff (to fit in 32-bit int), however the offset (for pread system call) has an off_t type which can be larger than 32-bit. This patch allows require_int() function to parse offset up to the maximum value implied by the off_t type. --- gdb/testsuite/gdb.server/pread-offset-size.S | 26 +++++++++++ .../gdb.server/pread-offset-size.exp | 45 +++++++++++++++++++ gdbserver/hostio.cc | 18 +++++--- 3 files changed, 84 insertions(+), 5 deletions(-) create mode 100644 gdb/testsuite/gdb.server/pread-offset-size.S create mode 100644 gdb/testsuite/gdb.server/pread-offset-size.exp diff --git a/gdb/testsuite/gdb.server/pread-offset-size.S b/gdb/testsuite/gdb.server/pread-offset-size.S new file mode 100644 index 00000000000..31748090ac3 --- /dev/null +++ b/gdb/testsuite/gdb.server/pread-offset-size.S @@ -0,0 +1,26 @@ +/* This testcase is part of GDB, the GNU debugger. + + Copyright 2023-2023 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + + .text + .globl _start +_start: + .skip 3742415472 + ret + .globl f + .type f, @function +f: + ret diff --git a/gdb/testsuite/gdb.server/pread-offset-size.exp b/gdb/testsuite/gdb.server/pread-offset-size.exp new file mode 100644 index 00000000000..c6acaa382b2 --- /dev/null +++ b/gdb/testsuite/gdb.server/pread-offset-size.exp @@ -0,0 +1,45 @@ +# Copyright (C) 2023-2023 Free Software Foundation, Inc. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +load_lib gdbserver-support.exp + +require allow_gdbserver_tests + +standard_testfile .S + +if { [prepare_for_testing ${testfile}.exp $testfile \ + $srcfile {debug additional_flags=-nostdlib} ] } { + return -1 +} + +gdb_exit +gdb_start + +gdb_test_no_output "set remote exec-file $binfile" \ +"set remote exec-file" + +# Make sure we're disconnected, in case we're testing with an +# extended-remote board, therefore already connected. +gdb_test "disconnect" ".*" + +set res [gdbserver_spawn ""] +set gdbserver_protocol [lindex $res 0] +set gdbserver_gdbport [lindex $res 1] + +gdb_test "target $gdbserver_protocol $gdbserver_gdbport" \ +"Remote debugging using .*" \ +"target $gdbserver_protocol $gdbserver_gdbport" + +gdb_test "break f" "Breakpoint 1.*" diff --git a/gdbserver/hostio.cc b/gdbserver/hostio.cc index 17b6179d8ca..2207804670b 100644 --- a/gdbserver/hostio.cc +++ b/gdbserver/hostio.cc @@ -89,12 +89,18 @@ require_filename (char **pp, char *filename) return 0; } +template static int -require_int (char **pp, int *value) +require_int (char **pp, T *value) { + constexpr bool is_signed = std::is_signed::value; + char *p; int count, firstdigit; + /* Max count of hexadecimal digits in off_t (1 hex digit is 4 bits) */ + int max_count = sizeof(T) * CHAR_BIT / 4; + p = *pp; *value = 0; count = 0; @@ -111,9 +117,9 @@ require_int (char **pp, int *value) firstdigit = nib; /* Don't allow overflow. */ - if (count >= 8 || (count == 7 && firstdigit >= 0x8)) + if (count >= max_count + || (is_signed && count == (max_count - 1) && firstdigit >= 0x8)) return -1; - *value = *value * 16 + nib; p++; count++; @@ -343,7 +349,8 @@ handle_open (char *own_buf) static void handle_pread (char *own_buf, int *new_packet_len) { - int fd, ret, len, offset, bytes_sent; + int fd, ret, len, bytes_sent; + off_t offset; char *p, *data; static int max_reply_size = -1; @@ -410,7 +417,8 @@ handle_pread (char *own_buf, int *new_packet_len) static void handle_pwrite (char *own_buf, int packet_len) { - int fd, ret, len, offset; + int fd, ret, len; + off_t offset; char *p, *data; p = own_buf + strlen ("vFile:pwrite:"); -- 2.43.0