From cc3edc52747fd8b184ee48f1b0cc1ac0aca7832e Mon Sep 17 00:00:00 2001 From: Eli Zaretskii 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/ChangeLog b/binutils/ChangeLog index c02a0eef948..5cdeb412ac2 100644 --- a/binutils/ChangeLog +++ b/binutils/ChangeLog @@ -1,3 +1,9 @@ +2021-01-28 Eli Zaretskii + + PR 4356 + * windres.c (quot): Use double quotes to protect strings on + Windows platforms. + 2021-01-28 Eli Zaretskii 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; } -- 2.30.2