summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--contrib/dblink/dblink.c47
1 files changed, 31 insertions, 16 deletions
diff --git a/contrib/dblink/dblink.c b/contrib/dblink/dblink.c
index a7809317dc0..2ed84da217d 100644
--- a/contrib/dblink/dblink.c
+++ b/contrib/dblink/dblink.c
@@ -28,6 +28,8 @@
*/
#include "postgres.h"
+#include <ctype.h>
+
#include "libpq-fe.h"
#include "fmgr.h"
@@ -73,6 +75,7 @@ static void append_res_ptr(dblink_results * results);
static void remove_res_ptr(dblink_results * results);
static char *generate_relation_name(Oid relid);
static char *connstr_strip_password(const char *connstr);
+static void dblink_security_check(PGconn *conn, const char *connstr);
/* Global */
List *res_id = NIL;
@@ -108,22 +111,10 @@ dblink_connect(PG_FUNCTION_ARGS)
oldcontext = MemoryContextSwitchTo(TopMemoryContext);
- /* for non-superusers, check that server requires a password */
- if (!superuser())
- {
- /* this attempt must fail */
- persistent_conn = PQconnectdb(connstr_strip_password(connstr));
-
- if (PQstatus(persistent_conn) == CONNECTION_OK)
- {
- PQfinish(persistent_conn);
- persistent_conn = NULL;
- elog(ERROR, "Non-superuser cannot connect if the server does not request a password.");
- }
- else
- PQfinish(persistent_conn);
- }
+ /* check password used if not superuser */
+ dblink_security_check(persistent_conn, connstr);
persistent_conn = PQconnectdb(connstr);
+
MemoryContextSwitchTo(oldcontext);
if (PQstatus(persistent_conn) == CONNECTION_BAD)
@@ -468,6 +459,8 @@ dblink_record(PG_FUNCTION_ARGS)
connstr = GET_STR(PG_GETARG_TEXT_P(0));
sql = GET_STR(PG_GETARG_TEXT_P(1));
+ /* check password used if not superuser */
+ dblink_security_check(conn, connstr);
conn = PQconnectdb(connstr);
if (PQstatus(conn) == CONNECTION_BAD)
{
@@ -652,6 +645,8 @@ dblink_exec(PG_FUNCTION_ARGS)
connstr = GET_STR(PG_GETARG_TEXT_P(0));
sql = GET_STR(PG_GETARG_TEXT_P(1));
+ /* check password used if not superuser */
+ dblink_security_check(conn, connstr);
conn = PQconnectdb(connstr);
if (PQstatus(conn) == CONNECTION_BAD)
{
@@ -738,7 +733,8 @@ dblink(PG_FUNCTION_ARGS)
if (fcinfo->flinfo->fn_extra == NULL)
{
-
+ /* check password used if not superuser */
+ dblink_security_check(conn, optstr);
conn = PQconnectdb(optstr);
if (PQstatus(conn) == CONNECTION_BAD)
{
@@ -2176,3 +2172,22 @@ connstr_strip_password(const char *connstr)
return result.data;
}
+
+static void
+dblink_security_check(PGconn *conn, const char *connstr)
+{
+ if (!superuser())
+ {
+ /* this attempt must fail */
+ conn = PQconnectdb(connstr_strip_password(connstr));
+
+ if (PQstatus(conn) == CONNECTION_OK)
+ {
+ PQfinish(conn);
+ conn = NULL;
+ elog(ERROR, "Non-superuser cannot connect if the server does not request a password.");
+ }
+ else
+ PQfinish(conn);
+ }
+}