* arguments containing LF or CR characters. A future major release should
* reject those characters in CREATE ROLE and CREATE DATABASE, because use
* there eventually leads to errors here.
+ *
+ * appendShellString() simply prints an error and dies if LF or CR appears.
+ * appendShellStringNoError() omits those characters from the result, and
+ * returns false if there were any.
*/
void
appendShellString(PQExpBuffer buf, const char *str)
+{
+ if (!appendShellStringNoError(buf, str))
+ {
+ fprintf(stderr,
+ _("shell command argument contains a newline or carriage return: \"%s\"\n"),
+ str);
+ exit(EXIT_FAILURE);
+ }
+}
+
+bool
+appendShellStringNoError(PQExpBuffer buf, const char *str)
{
#ifdef WIN32
int backslash_run_length = 0;
#endif
+ bool ok = true;
const char *p;
/*
strspn(str, "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_./:") == strlen(str))
{
appendPQExpBufferStr(buf, str);
- return;
+ return ok;
}
#ifndef WIN32
{
if (*p == '\n' || *p == '\r')
{
- fprintf(stderr,
- _("shell command argument contains a newline or carriage return: \"%s\"\n"),
- str);
- exit(EXIT_FAILURE);
+ ok = false;
+ continue;
}
if (*p == '\'')
{
if (*p == '\n' || *p == '\r')
{
- fprintf(stderr,
- _("shell command argument contains a newline or carriage return: \"%s\"\n"),
- str);
- exit(EXIT_FAILURE);
+ ok = false;
+ continue;
}
/* Change N backslashes before a double quote to 2N+1 backslashes. */
backslash_run_length--;
}
appendPQExpBufferStr(buf, "^\"");
-#endif /* WIN32 */
+#endif /* WIN32 */
+
+ return ok;
}
appendPsqlMetaConnect(PQExpBuffer buf, const char *dbname)
{
const char *s;
- bool complex;
+ bool complex;
/*
* If the name is plain ASCII characters, emit a trivial "\connect "foo"".
* general case. No database has a zero-length name.
*/
complex = false;
+
for (s = dbname; *s; s++)
{
if (*s == '\n' || *s == '\r')
{
atext++;
if (*atext == '\0')
- return false; /* premature end of string */
+ return false; /* premature end of string */
}
- *strings++ = *atext++; /* copy quoted data */
+ *strings++ = *atext++; /* copy quoted data */
}
atext++;
}