[binutils-gdb] Improve windres's handling of pathnames containing special characters on Windows platforms.

Nick Clifton nickc@sourceware.org
Thu Jan 28 14:58:27 GMT 2021


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=cc3edc52747fd8b184ee48f1b0cc1ac0aca7832e

commit cc3edc52747fd8b184ee48f1b0cc1ac0aca7832e
Author: Eli Zaretskii <eliz@gnu.org>
Date:   Thu Jan 28 14:57:33 2021 +0000

    Improve windres's handling of pathnames containing special characters on Windows platforms.
    
     PR 4356
     * windres.c (quot): Use double quotes to protect strings on
     Windows platforms.

Diff:
---
 binutils/ChangeLog |  6 ++++++
 binutils/windres.c | 31 ++++++++++++++++++++++++++++---
 2 files changed, 34 insertions(+), 3 deletions(-)

diff --git a/binutils/ChangeLog b/binutils/ChangeLog
index c02a0eef948..5cdeb412ac2 100644
--- a/binutils/ChangeLog
+++ b/binutils/ChangeLog
@@ -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
diff --git a/binutils/windres.c b/binutils/windres.c
index 41d1e928a54..b35661cb9f5 100644
--- a/binutils/windres.c
+++ b/binutils/windres.c
@@ -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;
 }


More information about the Binutils-cvs mailing list