From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 6648 invoked by alias); 9 Jun 2012 14:34:01 -0000 Received: (qmail 6640 invoked by uid 22791); 9 Jun 2012 14:34:00 -0000 X-SWARE-Spam-Status: No, hits=-4.2 required=5.0 tests=AWL,BAYES_00,KHOP_THREADED,RCVD_IN_DNSWL_NONE,RCVD_IN_HOSTKARMA_NO,RCVD_IN_HOSTKARMA_YE,SPF_SOFTFAIL X-Spam-Check-By: sourceware.org Received: from mtaout20.012.net.il (HELO mtaout20.012.net.il) (80.179.55.166) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Sat, 09 Jun 2012 14:33:46 +0000 Received: from conversion-daemon.a-mtaout20.012.net.il by a-mtaout20.012.net.il (HyperSendmail v2007.08) id <0M5C00100TOM9500@a-mtaout20.012.net.il> for gdb-patches@sourceware.org; Sat, 09 Jun 2012 17:33:44 +0300 (IDT) Received: from HOME-C4E4A596F7 ([87.69.210.75]) by a-mtaout20.012.net.il (HyperSendmail v2007.08) with ESMTPA id <0M5C001GKTS70750@a-mtaout20.012.net.il>; Sat, 09 Jun 2012 17:33:44 +0300 (IDT) Date: Sat, 09 Jun 2012 14:34:00 -0000 From: Eli Zaretskii Subject: Re: Quotes after --args In-reply-to: <833965voww.fsf@gnu.org> To: gdb-patches@sourceware.org Cc: bhr2@gmx.de Reply-to: Eli Zaretskii Message-id: <83bokstv04.fsf@gnu.org> MIME-version: 1.0 Content-type: text/plain; charset=utf-8 Content-transfer-encoding: 8BIT References: <1339164112.4081.ezmlm@sourceware.org> <20120608142102.302310@gmx.net> <833965voww.fsf@gnu.org> X-IsSubscribed: yes Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2012-06/txt/msg00263.txt.bz2 [Redirecting to gdb-patches@ from gdb@.] > Date: Fri, 08 Jun 2012 17:50:07 +0300 > From: Eli Zaretskii > Cc: gdb@sourceware.org > > > Date: Fri, 08 Jun 2012 16:21:02 +0200 > > From: "Markus Bühren" > > > > gdb --eval-command=run --batch --args test.exe -f "my testfile.txt" > > > > My program should get two arguments, '-f' and 'my testfile.txt'. However, replacing my actual program test.exe by a program that just prints the input arguments, I get the following result: > > > > C:\>gdb --eval-command=run --batch --args test.exe -f "my testfile.txt" > > [New thread 6180.0xad0] > > argv[0] = >>C:/test.exe<< > > argv[1] = >>-f<< > > argv[2] = >>my\<< > > argv[3] = >>testfile.txt<< > > > > Program exited normally. > > > > Can you help me to avoid that the file name is splitted into two arguments, with replacing the blank ' ' after 'my' by a backslash '\'? I have tried a lot of combinations of double double quotes '""', escaped double quotes '\"' and so on but I did not manage to get the file name passed as a single argument into my program. > > It's a bug. GDB handles the whitespace in a way that works on Posix > platforms, but not on Windows. Any objections to the patch below, which fixes this problem? (I tried to minimize uglifying the original sources; if someone sees a better way, please tell.) 2012-06-09 Eli Zaretskii * infcmd.c (construct_inferior_arguments) [__MINGW32__]: Quote special characters correctly for the Windows shells. See http://sourceware.org/ml/gdb/2012-06/msg00047.html for the bug report. --- infcmd.c~0 2012-02-23 10:18:38.000000000 +0200 +++ infcmd.c 2012-06-09 17:20:57.750500000 +0300 @@ -275,10 +275,18 @@ construct_inferior_arguments (int argc, if (STARTUP_WITH_SHELL) { +#ifdef __MINGW32__ + /* This holds all the characters considered special to the + Windows shells. */ + char *special = "\"!&*|[]{}<>?`~^=;, \t\n"; + const char quote = '"'; +#else /* This holds all the characters considered special to the typical Unix shells. We include `^' because the SunOS /bin/sh treats it as a synonym for `|'. */ char *special = "\"!#$&*()\\|[]{}<>?'\"`~^; \t\n"; + const char quote = '\''; +#endif int i; int length = 0; char *out, *cp; @@ -298,11 +306,20 @@ construct_inferior_arguments (int argc, /* Need to handle empty arguments specially. */ if (argv[i][0] == '\0') { - *out++ = '\''; - *out++ = '\''; + *out++ = quote; + *out++ = quote; } else { +#ifdef __MINGW32__ + int quoted = 0; + + if (strpbrk (argv[i], special)) + { + quoted = 1; + *out++ = quote; + } +#endif for (cp = argv[i]; *cp; ++cp) { if (*cp == '\n') @@ -310,17 +327,25 @@ construct_inferior_arguments (int argc, /* A newline cannot be quoted with a backslash (it just disappears), only by putting it inside quotes. */ - *out++ = '\''; + *out++ = quote; *out++ = '\n'; - *out++ = '\''; + *out++ = quote; } else { +#ifdef __MINGW32__ + if (*cp == quote) +#else if (strchr (special, *cp) != NULL) +#endif *out++ = '\\'; *out++ = *cp; } } +#ifdef __MINGW32__ + if (quoted) + *out++ = quote; +#endif } } *out = '\0';