From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from simark.ca by simark.ca with LMTP id +rOaLrujMWgSwjEAWB0awg (envelope-from ) for ; Sat, 24 May 2025 06:47:23 -0400 Authentication-Results: simark.ca; dkim=pass (1024-bit key; unprotected) header.d=redhat.com header.i=@redhat.com header.a=rsa-sha256 header.s=mimecast20190719 header.b=Z+woC7yS; dkim-atps=neutral Received: by simark.ca (Postfix, from userid 112) id AF23A1E11C; Sat, 24 May 2025 06:47:23 -0400 (EDT) X-Spam-Checker-Version: SpamAssassin 4.0.1 (2024-03-25) on simark.ca X-Spam-Level: X-Spam-Status: No, score=-10.1 required=5.0 tests=ARC_SIGNED,ARC_VALID, BAYES_00,DKIMWL_WL_HIGH,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU, 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 EF68C1E102 for ; Sat, 24 May 2025 06:47:22 -0400 (EDT) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 2DD1A385B83E for ; Sat, 24 May 2025 10:47:22 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 2DD1A385B83E Authentication-Results: sourceware.org; dkim=pass (1024-bit key, unprotected) header.d=redhat.com header.i=@redhat.com header.a=rsa-sha256 header.s=mimecast20190719 header.b=Z+woC7yS Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by sourceware.org (Postfix) with ESMTP id 033263858CD1 for ; Sat, 24 May 2025 10:46:48 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 033263858CD1 Authentication-Results: sourceware.org; dmarc=pass (p=quarantine dis=none) header.from=redhat.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=redhat.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 033263858CD1 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=170.10.133.124 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1748083609; cv=none; b=Bv9ztLyf6A3bP0+4bZlC7WPNZprg1l+snfFG/9PmNqa9L1XTXt7sgmfT5F4S57SyFjuWCWZNacXCbPrdF32RKaDUeCV5zPm4m86nPM0EOuPz+Mt521SpBEYbGSH+xuD1F3UFBe71kvbjn8pXOLRJZTVri0K2ckY1C2f8PtS9SRQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1748083609; c=relaxed/simple; bh=tktFXWccoM9wq6DbUQvyJOLqgDSKSpb8LWIrcmxV2Pg=; h=DKIM-Signature:From:To:Subject:Date:Message-ID:MIME-Version; b=V5xPBUCC/XyWvUPuxIu/rg+gjXoRGQcikhEFzV4p7HUeMQz4Pwm6+gqRn+H0Fv6ibWvy58TMDfo8+xaCSa5tF7a23/GRtMvNCXkyYl5+i75wsxnnTA4aLLLSu7RExNk3ZgxqXrMFRW3FetIpg7N36Bi+B7xRsF/jTk4pAEo5nSw= ARC-Authentication-Results: i=1; server2.sourceware.org DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 033263858CD1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1748083608; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: in-reply-to:in-reply-to:references:references; bh=E0mcoFQN1nEcQ3P/TzU0eDyDSOmsgysXPyvQ6Hrvj6Q=; b=Z+woC7yS/tIH/rt1GXrYHAyEt4DNLn39kRV25MWDu94Oglhd/znmZjpI7sBT+TAryWUaeA rUNK+ZuhD8XQ7L2bOjDBLS68RWWGr3NQJh8b15lXOPS7VRaE3T29TD7Y9FplG7F3IUBm2h /XXXTU3pu2uTs9NHLTYBZXxHYxOY50s= Received: from mail-wm1-f70.google.com (mail-wm1-f70.google.com [209.85.128.70]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-330-33WRJmWtPfWSBTVzFCXeaA-1; Sat, 24 May 2025 06:46:45 -0400 X-MC-Unique: 33WRJmWtPfWSBTVzFCXeaA-1 X-Mimecast-MFC-AGG-ID: 33WRJmWtPfWSBTVzFCXeaA_1748083605 Received: by mail-wm1-f70.google.com with SMTP id 5b1f17b1804b1-43cf5196c25so3579585e9.0 for ; Sat, 24 May 2025 03:46:45 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1748083604; x=1748688404; h=mime-version:message-id:date:references:in-reply-to:subject:cc:to :from:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=E0mcoFQN1nEcQ3P/TzU0eDyDSOmsgysXPyvQ6Hrvj6Q=; b=tCiQFu7PQqoREhMCRQaupKGl/ydXWjrXPiSpLjdQH15FSAHARay68c9yk3s/yvAW4k GNnck2/jwnzfM80g/7FIsAK1Z46tz/HMtbV05NZ2ADhAtLZX8Jpb0MFxha/WS6NO5P42 9vc4HTHkDXRFRN+s0+eC7klGbVTSxRPKRaIDjfk/FDaRnNJzBr12fUHigPa4JhRuclq+ qcd86FczFRRIJfeHt6Qbby3omGQV2hmWdYnagih2MjETxsflunJh4GjF+bTdxNHaW9SI rDhr2sGJEM2dbMWOUOXWo1Ss6xGxP130IZEB53y9MnLbbyDYzH/94SB3ieb0EYTanOYR VkIw== X-Forwarded-Encrypted: i=1; AJvYcCWb5APGZkXnaGTHhT3xp1kJ7uFdcpVQRG0/BpzgoQpNpwDKM6ndC0A0GuB+G4NMR7iOC1FZ7cECaiZs1Q==@sourceware.org X-Gm-Message-State: AOJu0YxTiR/VPB04qMsn6gvcy7JhDD8iV3YqrR994UhOg3QYlcFYWe/b x0B62X6DTLhdaYVB2MHiIQZo0RC387HKoBtaFiLZe1lbmWjcpxZcY6Tc/mcifnO2BENoyxhA0ut TwMKmrEvNrv0joIdMau5KlfdOnC9bj5gDf4MTo8V8KteNzumQSkmGEgp7B85Sp9oLeEuegrU= X-Gm-Gg: ASbGncvNAO9YkKa9mr+17SYJVPqPrqbB0t9LE67JPmMtTzEtcALHppkY537SBlOJXcl UbRMTG33xcsJBWHF9sFTcPATi0khaWm9GQqnCkKGi0rX23IKK9Yy/o4oIvB8/ORosgKf3yYSB25 0QFzpxAWNr1PT7sWdAiONEO8ghnGFYo+Y4INTtp+Cc7P4PzCJFRxDfFvngt/njrNitwdoU9otmG zSunPv9Ct9Khbm2NeoDYgPDNJiM+ZlyDjza1bFmAishD+C3ndtForHGgfMgnBU4/XVL3+UpsbMd bQL1i/s= X-Received: by 2002:a05:600c:8219:b0:43c:f70a:2af0 with SMTP id 5b1f17b1804b1-44c91dcba6amr26309985e9.16.1748083604272; Sat, 24 May 2025 03:46:44 -0700 (PDT) X-Google-Smtp-Source: AGHT+IGBIC71aWFXEOHK1wvSXUWLzK2cXkd8Vg/NYCKg2TmWG9PFLa1xGHmvCVknNBCHjKmQE/RKeA== X-Received: by 2002:a05:600c:8219:b0:43c:f70a:2af0 with SMTP id 5b1f17b1804b1-44c91dcba6amr26309765e9.16.1748083603866; Sat, 24 May 2025 03:46:43 -0700 (PDT) Received: from localhost ([109.144.29.20]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-3a35ca4d305sm30046392f8f.16.2025.05.24.03.46.43 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 24 May 2025 03:46:43 -0700 (PDT) From: Andrew Burgess To: Fabian Kilger , gdb-patches@sourceware.org Cc: Fabian Kilger Subject: Re: [PATCH 1/2][PR GDB/32956] gdb: implement linux namespace support for fileio_stat In-Reply-To: <20250511150113.3163767-2-kilger@sec.in.tum.de> References: <20250511150113.3163767-1-kilger@sec.in.tum.de> <20250511150113.3163767-2-kilger@sec.in.tum.de> Date: Sat, 24 May 2025 11:46:42 +0100 Message-ID: <87y0umgub1.fsf@redhat.com> MIME-Version: 1.0 X-Mimecast-Spam-Score: 0 X-Mimecast-MFC-PROC-ID: Phow8RBOw414GxrFNKuGQVb4KFO0debN4p9_FV4-YSw_1748083605 X-Mimecast-Originator: redhat.com Content-Type: text/plain 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 Fabian Kilger writes: > 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 ++++ Thinking about this some more, I realised that this is missing the gdbserver related changes. If you search in the gdbserver/ directory for how multifs_readlink is used then this will give a pretty good idea for how a new multifs_stat should be added. For manual testing things will be pretty similar to testing GDB. On the same host as your container, but outside of the container, start gdbserver: $ gdbserver --multi --once :54321 Then on the same host, start GDB, and within GDB: (gdb) target extended-remote :54321 (gdb) attach PID I'm assuming that currently you are just attaching directly from GDB to a process within the container? Thanks, Andrew > 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