Fix zero-length parameter bug in pex_run.
authorAndrew Stubbs <ams@codesourcery.com>
Mon, 19 Sep 2016 10:02:56 +0000 (10:02 +0000)
committerAndrew Stubbs <ams@gcc.gnu.org>
Mon, 19 Sep 2016 10:02:56 +0000 (10:02 +0000)
2016-09-19  Andrew Stubbs  <ams@codesourcery.com>

libiberty/
* pex-win32.c (argv_to_cmdline): Quote zero-length parameters.

libiberty/testsuite/
* test-pexecute.c (main): Insert check for zero-length parameters.

From-SVN: r240229

libiberty/ChangeLog
libiberty/pex-win32.c
libiberty/testsuite/test-pexecute.c

index 68609599786c6527c5fe00cbaeff442bf8cdc777..5934bc1fa8a3325842902256183c5a918ce201c6 100644 (file)
@@ -1,3 +1,8 @@
+2016-09-19  Andrew Stubbs  <ams@codesourcery.com>
+
+       * pex-win32.c (argv_to_cmdline): Quote zero-length parameters.
+       * testsuite/test-pexecute.c (main): Insert check for zero-length parameters.
+
 2016-09-10  Mark Wielaard  <mjw@redhat.com>
 
        * cp-demangle.c (d_substitution): Change struct demangle_component
index 66d2f1157c730ae99e62a2e2b4be20437c43af52..4c15b0d11a0e0b89ec3e188b57020b55aebed8dc 100644 (file)
@@ -370,6 +370,8 @@ argv_to_cmdline (char *const *argv)
              cmdline_len++;
            }
        }
+      if (j == 0)
+       needs_quotes = 1;
       /* Trailing backslashes also need to be escaped because they will be
          followed by the terminating quote.  */
       if (needs_quotes)
@@ -394,6 +396,8 @@ argv_to_cmdline (char *const *argv)
               break;
             }
         }
+      if (j == 0)
+       needs_quotes = 1;
 
       if (needs_quotes)
         {
index 8e01fda479a8936eea9cb756a1a3d637ded836ed..f62239d49b8d40dfcadb37400da929afa3c96cad 100644 (file)
@@ -285,6 +285,20 @@ main (int argc, char **argv)
     ERROR ("echo exit status failed");
   pex_free (pex1);
 
+  /* Check empty parameters don't get lost.  */
+  pex1 = TEST_PEX_INIT (PEX_USE_PIPES, "temp");
+  subargv[1] = "echo";
+  subargv[2] = "foo";
+  subargv[3] = "";
+  subargv[4] = "bar";
+  subargv[5] = NULL;
+  TEST_PEX_RUN (pex1, 0, "./test-pexecute", subargv, NULL, NULL);
+  e = TEST_PEX_READ_OUTPUT (pex1);
+  CHECK_LINE (e, "foo  bar");  /* Two spaces!  */
+  if (TEST_PEX_GET_STATUS_1 (pex1) != 0)
+    ERROR ("echo exit status failed");
+  pex_free (pex1);
+
   pex1 = TEST_PEX_INIT (PEX_USE_PIPES, "temp");
   subargv[1] = "echo";
   subargv[2] = "bar";