diff options
Diffstat (limited to 'src/fe_utils/string_utils.c')
-rw-r--r-- | src/fe_utils/string_utils.c | 17 |
1 files changed, 15 insertions, 2 deletions
diff --git a/src/fe_utils/string_utils.c b/src/fe_utils/string_utils.c index 2c566b1ad75..edbc869e453 100644 --- a/src/fe_utils/string_utils.c +++ b/src/fe_utils/string_utils.c @@ -418,7 +418,7 @@ appendByteaLiteral(PQExpBuffer buf, const unsigned char *str, size_t length, /* * Append the given string to the shell command being built in the buffer, - * with suitable shell-style quoting to create exactly one argument. + * with shell-style quoting as needed to create exactly one argument. * * Forbid LF or CR characters, which have scant practical use beyond designing * security breaches. The Windows command shell is unusable as a conduit for @@ -429,8 +429,22 @@ appendByteaLiteral(PQExpBuffer buf, const unsigned char *str, size_t length, void appendShellString(PQExpBuffer buf, const char *str) { +#ifdef WIN32 + int backslash_run_length = 0; +#endif const char *p; + /* + * Don't bother with adding quotes if the string is nonempty and clearly + * contains only safe characters. + */ + if (*str != '\0' && + strspn(str, "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_./:") == strlen(str)) + { + appendPQExpBufferStr(buf, str); + return; + } + #ifndef WIN32 appendPQExpBufferChar(buf, '\''); for (p = str; *p; p++) @@ -450,7 +464,6 @@ appendShellString(PQExpBuffer buf, const char *str) } appendPQExpBufferChar(buf, '\''); #else /* WIN32 */ - int backslash_run_length = 0; /* * A Windows system() argument experiences two layers of interpretation. |