* Exim - an Internet mail transport agent *
*************************************************/
+/* Copyright (c) The Exim Maintainers 2020 - 2023 */
/* Copyright (c) University of Cambridge 1995 - 2018 */
/* See the file NOTICE for conditions of use and distribution. */
+/* SPDX-License-Identifier: GPL-2.0-or-later */
/* Thanks to Petr Cech for contributing the original code for these
functions. Thanks to Joachim Wieland for the initial patch for the Unix domain
/* Add the connection to the cache */
- cn = store_get(sizeof(pgsql_connection), FALSE);
+ cn = store_get(sizeof(pgsql_connection), GET_UNTAINTED);
cn->server = server_copy;
cn->handle = pg_conn;
cn->next = pgsql_connections;
result = string_cat(result, US PQcmdTuples(pg_result));
*do_cache = 0;
DEBUG(D_lookup) debug_printf_indent("PGSQL: command does not return any data "
- "but was successful. Rows affected: %s\n", string_from_gstring(result));
+ "but was successful. Rows affected: %Y\n", result);
break;
case PGRES_TUPLES_OK:
uschar *tmp = US PQgetvalue(pg_result, i, j);
result = lf_quote(US PQfname(pg_result, j), tmp, Ustrlen(tmp), result);
}
+ if (!result) result = string_get(1);
}
/* If result is NULL then no data has been found and so we return FAIL. */
Arguments:
s the string to be quoted
opt additional option text or NULL if none
+ idx lookup type index
Returns: the processed string or NULL for a bad option
*/
static uschar *
-pgsql_quote(uschar *s, uschar *opt)
+pgsql_quote(uschar * s, uschar * opt, unsigned idx)
{
-register int c;
-int count = 0;
-uschar *t = s;
-uschar *quoted;
+int count = 0, c;
+uschar * t = s, * quoted;
-if (opt != NULL) return NULL; /* No options recognized */
+if (opt) return NULL; /* No options recognized */
-while ((c = *t++) != 0)
+while ((c = *t++))
if (Ustrchr("\n\t\r\b\'\"\\", c) != NULL) count++;
-if (count == 0) return s;
-t = quoted = store_get(Ustrlen(s) + count + 1, is_tainted(s));
+t = quoted = store_get_quoted(Ustrlen(s) + count + 1, s, idx);
-while ((c = *s++) != 0)
+while ((c = *s++))
{
if (c == '\'')
{
*t++ = '\\';
switch(c)
{
- case '\n': *t++ = 'n';
- break;
- case '\t': *t++ = 't';
- break;
- case '\r': *t++ = 'r';
- break;
- case '\b': *t++ = 'b';
- break;
- default: *t++ = c;
- break;
+ case '\n': *t++ = 'n'; break;
+ case '\t': *t++ = 't'; break;
+ case '\r': *t++ = 'r'; break;
+ case '\b': *t++ = 'b'; break;
+ default: *t++ = c; break;
}
}
else *t++ = c;
#include "../version.h"
-void
-pgsql_version_report(FILE *f)
+gstring *
+pgsql_version_report(gstring * g)
{
#ifdef DYNLOOKUP
-fprintf(f, "Library version: PostgreSQL: Exim version %s\n", EXIM_VERSION_STR);
+g = string_fmt_append(g, "Library version: PostgreSQL: Exim version %s\n", EXIM_VERSION_STR);
#endif
/* Version reporting: there appears to be no available information about
can access the server version and the chosen protocol version, but those
aren't really what we want. It might make sense to debug_printf those
when the connection is established though? */
+
+return g;
}