From cc3edc52747fd8b184ee48f1b0cc1ac0aca7832e Mon Sep 17 00:00:00 2001
From: Eli Zaretskii <eliz@gnu.org>
Date: Thu, 28 Jan 2021 14:57:33 +0000
Subject: [PATCH] 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.
---
 binutils/ChangeLog |  6 ++++++
 binutils/windres.c | 31 ++++++++++++++++++++++++++++---
 2 files changed, 34 insertions(+), 3 deletions(-)

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;
 }
