From patchwork Fri May 22 00:16:23 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Pedro Alves X-Patchwork-Id: 135437 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from vm01.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id B1FE048F52C1 for ; Fri, 22 May 2026 00:17:02 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org B1FE048F52C1 X-Original-To: gdb-patches@sourceware.org Delivered-To: gdb-patches@sourceware.org Received: from mail-wm1-f46.google.com (mail-wm1-f46.google.com [209.85.128.46]) by sourceware.org (Postfix) with ESMTPS id A27D148F66DC for ; Fri, 22 May 2026 00:16:33 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org A27D148F66DC Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=palves.net Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=gmail.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org A27D148F66DC Authentication-Results: sourceware.org; arc=none smtp.remote-ip=209.85.128.46 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1779408993; cv=none; b=MSWD1dtX1DP7THjfy/vLoaHbUg4tbpBiaQ2WTE5i9+RlPuDPad12/1NIHuQRbjGZQ1HB/SCYXCEJaV64N2fsJ2+HNoHUPFw3c73240wlEFc6nGC4LFtlb2A8zONHcsKZ/GCR1h05tGzWbTS/3PawJIi0ijFyQlEYJEA7SSuHrhI= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1779408993; c=relaxed/simple; bh=zhCj2jYPrlMmnvTgAxhBK3mlGLmYtqPedGNdfaSUH/Q=; h=From:To:Subject:Date:Message-ID:MIME-Version; b=Tb/7Jd1gdglTxLdHeOnXckhjH9ARHqwSVEkVK3X7Nk98NF82AaX8KrI6LIKw+tlJBBQsy8a1f9vGPkGRn/78JU3Gaju1uAiWo34mCYKJ/Pr5+qg/AOX2BWIcexrUBKCUDAxoGgIoPL+N5bLL84zZicitU3+zr2j+CXXVwHdCO8c= ARC-Authentication-Results: i=1; sourceware.org DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org A27D148F66DC Received: by mail-wm1-f46.google.com with SMTP id 5b1f17b1804b1-48a563e4ef7so52869105e9.0 for ; Thu, 21 May 2026 17:16:33 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1779408992; x=1780013792; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=OUYzLk69iaS+lwwNC84ALdpJwJKsqyVShDA++8NJdfQ=; b=VeodPcv/OpWgaJYYVm+meF/4hiqLrh62gPuVROmqcPtSl7XYxbBPALy/Qk1iN5K+sI FPGjl248wpc9Y7q4LMG501njhS9f14mlAr96CloPBbUSUC9lHzzXzaIA5sVZ6GVGSIT4 jjsXmldZQkSm+Fi9M/t2WB3PNlTILSlD6JPhmfVuolY5QDmEhkAEHABFfarwwIM9N9Ln lTTf26SIqPS/IyxlZC+cN4tSo/vImkziGFkQJi4QBBzysH2HXYLLqPhLFmHPztr3FboS 7bwdtyRWmrnW3+bHTr3EhDuliwPUvJSo0lZWJELa5sDn3GwSdsvn6r4FNDPh6X8u5Qst f/QQ== X-Gm-Message-State: AOJu0Yz6+mHyTSWGWIWxdRc0OsKAzgr9tvU0KJxykkbfPv9X1AvZwLQE 9NDshKN8BQa1tX4RxSkwe7jhvmdgOpPmuQg0G5U4ANZdWWY3DMK9NiAPRaIt2A== X-Gm-Gg: Acq92OGm4bWyGNgA2yrW16H8djVUkbk60m2dk0G1GQ6Q/nFAKwG6i2pduLJZ7VWaFEJ SzdvAJgPBcnP0THKXCeK3RP6m9EsvILs+dOZ66oylwpf84c8pbqdH59vTIJFL/pOKP6gpM3lZ5k JOEiX25fZBJhxorB9RuM70iMWD/tp2PR+BUESsepFFw7BGM7IzSkTSvt6qUY+KD8JSOYXHC9YKr +GRkG3lIpgFizy4mUv168nz0ORRDaYjoJgLIqadPdFgJP13Vrw9+mPKhKHLbkDMyTolklYuAJOO tob/hhSW37hOCf394GviTZQIlnIAx/v3piXhucBUIxUV/CBKOtdbtGQs3KE53XM4H1EmnoY5ORL iWhLFErwOxP9Hn74Jz0I4xjFxqNVcpNjgt6+0a3PDw/W3l9qIg5QZq0n0V6LJwGe/HPS/rLxUqy tiUsub+ADyBjavewmKPmz5aw== X-Received: by 2002:a05:600c:3547:b0:48f:e230:8cab with SMTP id 5b1f17b1804b1-49042adfb3fmr11846745e9.31.1779408992133; Thu, 21 May 2026 17:16:32 -0700 (PDT) Received: from localhost ([2001:8a0:fae3:2600:cb04:347e:aaad:ca08]) by smtp.gmail.com with UTF8SMTPSA id 5b1f17b1804b1-49045282201sm6416565e9.8.2026.05.21.17.16.31 for (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Thu, 21 May 2026 17:16:31 -0700 (PDT) From: Pedro Alves To: gdb-patches@sourceware.org Subject: [PATCH 2/5] Fix "set cwd ..." on Cygwin, part 2 Date: Fri, 22 May 2026 01:16:23 +0100 Message-ID: <20260522001626.393908-3-pedro@palves.net> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260522001626.393908-1-pedro@palves.net> References: <20260522001626.393908-1-pedro@palves.net> MIME-Version: 1.0 X-Spam-Status: No, score=-8.3 required=5.0 tests=BAYES_00, FREEMAIL_FORGED_FROMDOMAIN, FREEMAIL_FROM, GIT_PATCH_0, HEADER_FROM_DIFFERENT_DOMAINS, KAM_DMARC_STATUS, KAM_NUMSUBJECT, POISEN_SPAM_PILL, POISEN_SPAM_PILL_1, POISEN_SPAM_PILL_3, RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H2, RCVD_IN_PBL, SPF_HELO_NONE, SPF_PASS, TXREP shortcircuit=no autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on sourceware.org 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 Even after the previous patch, on both native and gdbserver Cygwin, we get: (gdb) set cwd /cygdrive/d/cygwin-gdb/build-testsuite/outputs/gdb.base/exitsignal (gdb) start Temporary breakpoint 3 at 0x100401094: file /home/alves/rocm/gdb/src/gdb/testsuite/gdb.base/segv.c, line 26. Starting program: /cygdrive/d/cygwin-gdb/build-testsuite/outputs/gdb.base/exitsignal/exitsignal.exe ❌️ Error creating process /cygdrive/d/cygwin-gdb/build-testsuite/outputs/gdb.base/exitsignal/exitsignal.exe (error 6): The handle is invalid. (gdb) On the native side, this is because in windows_nat_target::create_inferior, we unconditionally convert forward slashes to backward slashes: /cygdrive/d/cygwin-gdb/build-testsuite/outputs/gdb.base/exitsignal => \cygdrive\d\cygwin-gdb\build-testsuite\outputs\gdb.base\exitsignal and then cygwin_conv_path(CCP_POSIX_TO_WIN_W) does nothing on such path, as the backward slashes make the path not look like a Unix-style path. CreateProcess then fails to CD into that directory, as that's not a real Windows native path. The fix is to not do the slashes replacement on Cygwin. On the gdbserver side, we're just completely missing the cygwin_conv_path logic. This commit adds it. The code isn't shared with GDB because GDB uses wide chars, and gdbserver uses narrow char. Change-Id: I004f2a562757a566423f6acb9aecfcc1a7f2f746 commit-id: 85aa8c22 --- gdb/windows-nat.c | 14 ++++++++------ gdbserver/win32-low.cc | 30 +++++++++++++++++++++++++----- 2 files changed, 33 insertions(+), 11 deletions(-) diff --git a/gdb/windows-nat.c b/gdb/windows-nat.c index 862568fa21e..a284438bd36 100644 --- a/gdb/windows-nat.c +++ b/gdb/windows-nat.c @@ -2881,10 +2881,17 @@ windows_nat_target::create_inferior (const char *exec_file, else { expanded_infcwd = gdb_tilde_expand (inferior_cwd); + inferior_cwd = expanded_infcwd.c_str (); +#ifndef __CYGWIN__ /* Mirror slashes on inferior's cwd. */ std::replace (expanded_infcwd.begin (), expanded_infcwd.end (), '/', '\\'); - inferior_cwd = expanded_infcwd.c_str (); +#else + if (cygwin_conv_path (CCP_POSIX_TO_WIN_W, + inferior_cwd, + infcwd, sizeof (infcwd)) < 0) + error (_("Error converting inferior cwd: %d"), errno); +#endif } memset (&si, 0, sizeof (si)); @@ -2923,11 +2930,6 @@ windows_nat_target::create_inferior (const char *exec_file, flags |= DEBUG_PROCESS; } - if (inferior_cwd != NULL - && cygwin_conv_path (CCP_POSIX_TO_WIN_W, inferior_cwd, - infcwd, sizeof (infcwd)) < 0) - error (_("Error converting inferior cwd: %d"), errno); - args = (wchar_t *) alloca ((wcslen (toexec) + wcslen (cygallargs) + 2) * sizeof (wchar_t)); wcscpy (args, toexec); diff --git a/gdbserver/win32-low.cc b/gdbserver/win32-low.cc index 469ff32f070..6f1cf5ed025 100644 --- a/gdbserver/win32-low.cc +++ b/gdbserver/win32-low.cc @@ -448,9 +448,11 @@ static BOOL create_process (const char *program, char *args, DWORD flags, PROCESS_INFORMATION *pi) { - const std::string &inferior_cwd = get_inferior_cwd (); BOOL ret; size_t argslen, proglen; +#ifdef __CYGWIN__ + char infcwd_buf[PATH_MAX]; +#endif proglen = strlen (program) + 1; argslen = strlen (args) + proglen; @@ -458,6 +460,27 @@ create_process (const char *program, char *args, STARTUPINFOA si = { sizeof (STARTUPINFOA) }; char *program_and_args = (char *) alloca (argslen + 1); + const char *inferior_cwd = get_inferior_cwd ().c_str (); + std::string expanded_infcwd; + if (*inferior_cwd == '\0') + inferior_cwd = nullptr; + else + { + expanded_infcwd = gdb_tilde_expand (inferior_cwd); + inferior_cwd = expanded_infcwd.c_str (); +#ifndef __CYGWIN__ + /* Mirror slashes on inferior's cwd. */ + std::replace (expanded_infcwd.begin (), expanded_infcwd.end (), + '/', '\\'); +#else + if (cygwin_conv_path (CCP_POSIX_TO_WIN_A, + inferior_cwd, + infcwd_buf, sizeof (infcwd_buf)) < 0) + error (_("Error converting inferior cwd: %d"), errno); + inferior_cwd = infcwd_buf; +#endif + } + strcpy (program_and_args, program); strcat (program_and_args, " "); strcat (program_and_args, args); @@ -465,10 +488,7 @@ create_process (const char *program, char *args, program_and_args, /* command line */ flags, /* start flags */ NULL, /* environment */ - /* current directory */ - (inferior_cwd.empty () - ? NULL - : gdb_tilde_expand (inferior_cwd).c_str()), + inferior_cwd, /* current directory */ get_client_state ().disable_randomization, &si, /* start info */ pi); /* proc info */