From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from simark.ca by simark.ca with LMTP id 9D6YGAC8IGhIvh4AWB0awg (envelope-from ) for ; Sun, 11 May 2025 11:02:24 -0400 Received: by simark.ca (Postfix, from userid 112) id 32E0C1E10E; Sun, 11 May 2025 11:02:24 -0400 (EDT) X-Spam-Checker-Version: SpamAssassin 4.0.1 (2024-03-25) on simark.ca X-Spam-Level: X-Spam-Status: No, score=-9.0 required=5.0 tests=ARC_SIGNED,ARC_VALID,BAYES_00, MAILING_LIST_MULTI,RCVD_IN_DNSWL_MED,RCVD_IN_VALIDITY_CERTIFIED, RCVD_IN_VALIDITY_RPBL,RCVD_IN_VALIDITY_SAFE 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 9636E1E092 for ; Sun, 11 May 2025 11:02:22 -0400 (EDT) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 2EFEC385AC20 for ; Sun, 11 May 2025 15:02:22 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 2EFEC385AC20 Received: from mailout1.rbg.tum.de (mailout1.rbg.tum.de [IPv6:2a09:80c0::201]) by sourceware.org (Postfix) with ESMTPS id ED7EC3858426 for ; Sun, 11 May 2025 15:01:49 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org ED7EC3858426 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=sec.in.tum.de Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=sec.in.tum.de ARC-Filter: OpenARC Filter v1.0.0 sourceware.org ED7EC3858426 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=2a09:80c0::201 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1746975710; cv=none; b=ZSN4MJ4WjuXNmrW0CYnu0OrNSq+NRMZn2b/UtLp6ScuzaIc0xzNsDQkfhqRY+1cVx2B9H9QU/0zr8hFn+NM42VKy3+CL75p8HRJA58GsS5UNfDzmgHdKLjr0Sdyt5gqYvQXNxI0EfcoeMeLaquZbCFzR7uST02qR3SQazfSNzas= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1746975710; c=relaxed/simple; bh=51eGzWeretx9jIBrNPwytVNyRWBKBwhSPffLbKqwHgk=; h=From:To:Subject:Date:Message-ID:MIME-Version; b=CSMTw6a+1gFTDhOeH3VsrMGVuRJjZ9aUETfdMJLJs4Y/ZmO7ecbqcgayWicaNF+aiYt5K1lJ8DZPJc7xV604c5k3FDyuOhJkTUqkDctXG1+53Uydx5YIznqw1YC5GDQt0bN8lMEm5EfdaKKD+olD1hhYh52USB+vKK0NClLKdxQ= ARC-Authentication-Results: i=1; server2.sourceware.org DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org ED7EC3858426 Received: from mailrelay1.rbg.tum.de (mailrelay1.in.tum.de [131.159.254.14]) by mailout1.rbg.tum.de (Postfix) with ESMTPS id B5AD042 for ; Sun, 11 May 2025 17:01:48 +0200 (CEST) Received: by mailrelay1.rbg.tum.de (Postfix, from userid 112) id B26C310C; Sun, 11 May 2025 17:01:48 +0200 (CEST) Received: from mailrelay1.rbg.tum.de (localhost [127.0.0.1]) by mailrelay1.rbg.tum.de (Postfix) with ESMTP id 52EDC10B for ; Sun, 11 May 2025 17:01:48 +0200 (CEST) Received: from services.sec.in.tum.de (services.sec.in.tum.de [131.159.50.242]) by mailrelay1.rbg.tum.de (Postfix) with ESMTPS id 5108945 for ; Sun, 11 May 2025 17:01:48 +0200 (CEST) Received: from frederica.fritz.box (unknown [192.168.253.2]) by services.sec.in.tum.de (Postfix) with ESMTPSA id E55FE100B93CA; Sun, 11 May 2025 17:01:47 +0200 (CEST) From: Fabian Kilger To: gdb-patches@sourceware.org Cc: Fabian Kilger Subject: [PATCH 1/2][PR GDB/32956] gdb: implement linux namespace support for fileio_stat Date: Sun, 11 May 2025 17:01:12 +0200 Message-ID: <20250511150113.3163767-2-kilger@sec.in.tum.de> X-Mailer: git-send-email 2.49.0 In-Reply-To: <20250511150113.3163767-1-kilger@sec.in.tum.de> References: <20250511150113.3163767-1-kilger@sec.in.tum.de> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit 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 The new algorithm to look for a build-id-based debug file (introduced by commit 22836ca88591ac7efacf06d5b6db191763fd8aba) makes use of fileio_stat. As fileio_stat was not supported by linux-namespace.c, all stat calls would be performed on the host and not inside the namespace --- gdb/linux-nat.c | 14 ++++++++ gdb/linux-nat.h | 3 ++ gdb/nat/linux-namespaces.c | 71 ++++++++++++++++++++++++++++++++++++++ gdb/nat/linux-namespaces.h | 6 ++++ 4 files changed, 94 insertions(+) diff --git a/gdb/linux-nat.c b/gdb/linux-nat.c index 3f252370c7b..478a7977c4d 100644 --- a/gdb/linux-nat.c +++ b/gdb/linux-nat.c @@ -4585,6 +4585,20 @@ linux_nat_target::fileio_open (struct inferior *inf, const char *filename, return fd; } +/* Implementation of to_fileio_stat. */ +int +linux_nat_target::fileio_stat (struct inferior *inf, const char *filename, + struct stat *sb, fileio_error *target_errno) +{ + int r = linux_mntns_stat (linux_nat_fileio_pid_of (inf), + filename, sb); + + if (r == -1) + *target_errno = host_to_fileio_error (errno); + + return r; +} + /* Implementation of to_fileio_readlink. */ std::optional diff --git a/gdb/linux-nat.h b/gdb/linux-nat.h index b630b858e34..42d1ec142b3 100644 --- a/gdb/linux-nat.h +++ b/gdb/linux-nat.h @@ -108,6 +108,9 @@ class linux_nat_target : public inf_ptrace_target const char *filename, fileio_error *target_errno) override; + int fileio_stat (struct inferior *inf, const char *filename, + struct stat *sb, fileio_error *target_errno) override; + int fileio_unlink (struct inferior *inf, const char *filename, fileio_error *target_errno) override; diff --git a/gdb/nat/linux-namespaces.c b/gdb/nat/linux-namespaces.c index 19a05eec905..aa74e9df950 100644 --- a/gdb/nat/linux-namespaces.c +++ b/gdb/nat/linux-namespaces.c @@ -233,6 +233,12 @@ enum mnsh_msg_type MNSH_RET_INT. */ MNSH_REQ_SETNS, + /* A request that the helper call stat. The single + argument (the filename) should be passed in BUF, and + should include a terminating NUL character. The helper + should respond with a MNSH_RET_INTSTR. */ + MNSH_REQ_STAT, + /* A request that the helper call open. Arguments should be passed in BUF, INT1 and INT2. The filename (in BUF) should include a terminating NUL character. The helper @@ -283,6 +289,10 @@ mnsh_debug_print_message (enum mnsh_msg_type type, debug_printf ("ERROR"); break; + case MNSH_REQ_STAT: + debug_printf ("STAT"); + break; + case MNSH_REQ_SETNS: debug_printf ("SETNS"); break; @@ -514,6 +524,20 @@ mnsh_handle_setns (int sock, int fd, int nstype) return mnsh_return_int (sock, result, errno); } + +/* Handle a MNSH_REQ_STAT message. Must be async-signal-safe. */ + +static ssize_t +mnsh_handle_stat(int sock, const char *filename) +{ + struct stat sb; + int stat_ok = stat(filename, &sb); + + return mnsh_return_intstr(sock, stat_ok, &sb, + stat_ok == -1 ? 0 : sizeof (sb), + errno); +} + /* Handle a MNSH_REQ_OPEN message. Must be async-signal-safe. */ static ssize_t @@ -574,6 +598,11 @@ mnsh_main (int sock) response = mnsh_handle_setns (sock, fd, int1); break; + case MNSH_REQ_STAT: + if (size > 0 && buf[size - 1] == '\0') + response = mnsh_handle_stat(sock, buf); + break; + case MNSH_REQ_OPEN: if (size > 0 && buf[size - 1] == '\0') response = mnsh_handle_open (sock, buf, int1, int2); @@ -765,6 +794,10 @@ mnsh_maybe_mourn_peer (void) mnsh_send_message (helper->sock, MNSH_REQ_OPEN, -1, flags, mode, \ filename, strlen (filename) + 1) +#define mnsh_send_stat(helper, filename) \ + mnsh_send_message (helper->sock, MNSH_REQ_STAT, -1, 0, 0, \ + filename, strlen (filename) + 1) + #define mnsh_send_unlink(helper, filename) \ mnsh_send_message (helper->sock, MNSH_REQ_UNLINK, -1, 0, 0, \ filename, strlen (filename) + 1) @@ -945,6 +978,44 @@ linux_mntns_access_fs (pid_t pid) return MNSH_FS_HELPER; } + +/* See nat/linux-namespaces.h. */ +int +linux_mntns_stat (pid_t pid, const char *filename, + struct stat *sb) +{ + enum mnsh_fs_code access = linux_mntns_access_fs (pid); + struct linux_mnsh *helper; + int stat_ok, error; + ssize_t size; + + if (access == MNSH_FS_ERROR) + return -1; + + if (access == MNSH_FS_DIRECT) + return stat(filename, sb); + + gdb_assert (access == MNSH_FS_HELPER); + + helper = linux_mntns_get_helper (); + + size = mnsh_send_stat (helper, filename); + if (size < 0) + return -1; + + size = mnsh_recv_intstr (helper, &stat_ok, &error, sb, sizeof (*sb)); + + if (size < 0) + { + stat_ok = -1; + errno = error; + } + else + gdb_assert (stat_ok == -1 || size == sizeof (*sb)); + + return stat_ok; +} + /* See nat/linux-namespaces.h. */ int diff --git a/gdb/nat/linux-namespaces.h b/gdb/nat/linux-namespaces.h index 4327292950b..825cb27eb2d 100644 --- a/gdb/nat/linux-namespaces.h +++ b/gdb/nat/linux-namespaces.h @@ -58,6 +58,12 @@ enum linux_ns_type extern int linux_ns_same (pid_t pid, enum linux_ns_type type); +/* Like stat(2), but in the mount namespace of process + PID. */ + +extern int linux_mntns_stat (pid_t pid, const char *filename, + struct stat *sb); + /* Like gdb_open_cloexec, but in the mount namespace of process PID. */ -- 2.49.0