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