diff options
author | Eli Zaretskii <eliz@gnu.org> | 2021-01-28 14:57:33 +0000 |
---|---|---|
committer | Nick Clifton <nickc@redhat.com> | 2021-01-28 14:57:33 +0000 |
commit | cc3edc52747fd8b184ee48f1b0cc1ac0aca7832e (patch) | |
tree | 8ab99dd07fd5c274ea4f7fada5a7f79898f18acc /binutils/windres.c | |
parent | 53e556e5b45e3d8fda25be3623883a0952c0c716 (diff) | |
download | gdb-cc3edc52747fd8b184ee48f1b0cc1ac0aca7832e.zip gdb-cc3edc52747fd8b184ee48f1b0cc1ac0aca7832e.tar.gz gdb-cc3edc52747fd8b184ee48f1b0cc1ac0aca7832e.tar.bz2 |
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.
Diffstat (limited to 'binutils/windres.c')
-rw-r--r-- | binutils/windres.c | 31 |
1 files changed, 28 insertions, 3 deletions
diff --git a/binutils/windres.c b/binutils/windres.c index 41d1e92..b35661c 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; } |