blob: 5a6071938899c6dfb9716f32a31c76d16c74af68 [file] [log] [blame] [edit]
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;
}