Improve windres's handling of pathnames containing special characters on Windows...
authorEli Zaretskii <eliz@gnu.org>
Thu, 28 Jan 2021 14:57:33 +0000 (14:57 +0000)
committerNick Clifton <nickc@redhat.com>
Thu, 28 Jan 2021 14:57:33 +0000 (14:57 +0000)
 PR 4356
 * windres.c (quot): Use double quotes to protect strings on
 Windows platforms.

binutils/ChangeLog
binutils/windres.c

index c02a0eef94855c70bc772663ae4c579ce248be6e..5cdeb412ac21c2768118138bab6a4ab22f293d1d 100644 (file)
@@ -1,3 +1,9 @@
+2021-01-28  Eli Zaretskii  <eliz@gnu.org>
+
+       PR 4356
+       * windres.c (quot): Use double quotes to protect strings on
+       Windows platforms.
+
 2021-01-28  Eli Zaretskii  <eliz@gnu.org>
 
        PR 27252
index 41d1e928a54c4db78a1f40b546d1a19eb9f613ed..b35661cb9f58354757b160552f73c209ac8d83d6 100644 (file)
@@ -703,19 +703,44 @@ quot (const char *string)
   const char *src;
   char *dest;
 
-  if ((buflen < slen * 2 + 2) || ! buf)
+  if ((buflen < slen * 2 + 3) || ! buf)
     {
-      buflen = slen * 2 + 2;
+      buflen = slen * 2 + 3;
       free (buf);
       buf = (char *) xmalloc (buflen);
     }
 
-  for (src=string, dest=buf; *src; src++, dest++)
+#if defined (_WIN32) && !defined (__CYGWIN__)
+  /* For Windows shells, quote "like this".   */
+  {
+    bfd_boolean quoted = FALSE;
+
+    dest = buf;
+    if (strchr (string, ' '))
+      {
+       quoted = TRUE;
+       *dest++ = '"';
+      }
+
+    for (src = string; *src; src++, dest++)
+      {
+       /* Escape-protect embedded double quotes.  */
+       if (quoted && *src == '"')
+         *dest++ = '\\';
+       *dest = *src;
+      }
+
+    if (quoted)
+      *dest++ = '"';
+  }
+#else
+  for (src = string, dest = buf; *src; src++, dest++)
     {
       if (*src == '(' || *src == ')' || *src == ' ')
        *dest++ = '\\';
       *dest = *src;
     }
+#endif
   *dest = 0;
   return buf;
 }