aboutsummaryrefslogtreecommitdiff
path: root/src/fe_utils/string_utils.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/fe_utils/string_utils.c')
-rw-r--r--src/fe_utils/string_utils.c17
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.