Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit919c9f6

Browse files
committed
The original patch to disallow non-passworded connections to non-superusers
failed to cover all the ways in which a connection can be initiated in dblink.Plug the remaining holes. Also, disallow transient connections in functionsfor which that feature makes no sense (because they are only sensible aspart of a sequence of operations on the same connection). Joe ConwaySecurity:CVE-2007-6601
1 parenteedb068 commit919c9f6

File tree

3 files changed

+86
-38
lines changed

3 files changed

+86
-38
lines changed

‎contrib/dblink/dblink.c

Lines changed: 40 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
* Darko Prenosil <Darko.Prenosil@finteh.hr>
99
* Shridhar Daithankar <shridhar_daithankar@persistent.co.in>
1010
*
11-
* $PostgreSQL: pgsql/contrib/dblink/dblink.c,v 1.67 2008/01/01 19:45:45 momjian Exp $
11+
* $PostgreSQL: pgsql/contrib/dblink/dblink.c,v 1.68 2008/01/03 21:27:59 tgl Exp $
1212
* Copyright (c) 2001-2008, PostgreSQL Global Development Group
1313
* ALL RIGHTS RESERVED;
1414
*
@@ -91,6 +91,7 @@ static int16 get_attnum_pk_pos(int2vector *pkattnums, int16 pknumatts, int16 key
9191
staticHeapTupleget_tuple_of_interest(Oidrelid,int2vector*pkattnums,int16pknumatts,char**src_pkattvals);
9292
staticOidget_relid_from_relname(text*relname_text);
9393
staticchar*generate_relation_name(Oidrelid);
94+
staticvoiddblink_security_check(PGconn*conn,remoteConn*rconn);
9495

9596
/* Global */
9697
staticremoteConn*pconn=NULL;
@@ -187,10 +188,21 @@ typedef struct remoteConnHashEnt
187188
errmsg("could not establish connection"), \
188189
errdetail("%s", msg))); \
189190
} \
191+
dblink_security_check(conn, rconn); \
190192
freeconn = true; \
191193
} \
192194
} while (0)
193195

196+
#defineDBLINK_GET_NAMED_CONN \
197+
do { \
198+
char *conname = GET_STR(PG_GETARG_TEXT_P(0)); \
199+
rconn = getConnectionByName(conname); \
200+
if(rconn) \
201+
conn = rconn->conn; \
202+
else \
203+
DBLINK_CONN_NOT_AVAIL; \
204+
} while (0)
205+
194206
#defineDBLINK_INIT \
195207
do { \
196208
if (!pconn) \
@@ -247,21 +259,8 @@ dblink_connect(PG_FUNCTION_ARGS)
247259
errdetail("%s",msg)));
248260
}
249261

250-
if (!superuser())
251-
{
252-
if (!PQconnectionUsedPassword(conn))
253-
{
254-
PQfinish(conn);
255-
if (rconn)
256-
pfree(rconn);
257-
258-
ereport(ERROR,
259-
(errcode(ERRCODE_S_R_E_PROHIBITED_SQL_STATEMENT_ATTEMPTED),
260-
errmsg("password is required"),
261-
errdetail("Non-superuser cannot connect if the server does not request a password."),
262-
errhint("Target server's authentication method must be changed.")));
263-
}
264-
}
262+
/* check password used if not superuser */
263+
dblink_security_check(conn,rconn);
265264

266265
if (connname)
267266
{
@@ -1047,17 +1046,11 @@ PG_FUNCTION_INFO_V1(dblink_is_busy);
10471046
Datum
10481047
dblink_is_busy(PG_FUNCTION_ARGS)
10491048
{
1050-
char*msg;
10511049
PGconn*conn=NULL;
1052-
char*conname=NULL;
1053-
char*connstr=NULL;
10541050
remoteConn*rconn=NULL;
1055-
boolfreeconn= false;
10561051

10571052
DBLINK_INIT;
1058-
DBLINK_GET_CONN;
1059-
if (!conn)
1060-
DBLINK_CONN_NOT_AVAIL;
1053+
DBLINK_GET_NAMED_CONN;
10611054

10621055
PQconsumeInput(conn);
10631056
PG_RETURN_INT32(PQisBusy(conn));
@@ -1078,26 +1071,20 @@ PG_FUNCTION_INFO_V1(dblink_cancel_query);
10781071
Datum
10791072
dblink_cancel_query(PG_FUNCTION_ARGS)
10801073
{
1081-
char*msg;
10821074
intres=0;
10831075
PGconn*conn=NULL;
1084-
char*conname=NULL;
1085-
char*connstr=NULL;
10861076
remoteConn*rconn=NULL;
1087-
boolfreeconn= false;
10881077
PGcancel*cancel;
10891078
charerrbuf[256];
10901079

10911080
DBLINK_INIT;
1092-
DBLINK_GET_CONN;
1093-
if (!conn)
1094-
DBLINK_CONN_NOT_AVAIL;
1081+
DBLINK_GET_NAMED_CONN;
10951082
cancel=PQgetCancel(conn);
10961083

10971084
res=PQcancel(cancel,errbuf,256);
10981085
PQfreeCancel(cancel);
10991086

1100-
if (res==0)
1087+
if (res==1)
11011088
PG_RETURN_TEXT_P(GET_TEXT("OK"));
11021089
else
11031090
PG_RETURN_TEXT_P(GET_TEXT(errbuf));
@@ -1120,18 +1107,13 @@ dblink_error_message(PG_FUNCTION_ARGS)
11201107
{
11211108
char*msg;
11221109
PGconn*conn=NULL;
1123-
char*conname=NULL;
1124-
char*connstr=NULL;
11251110
remoteConn*rconn=NULL;
1126-
boolfreeconn= false;
11271111

11281112
DBLINK_INIT;
1129-
DBLINK_GET_CONN;
1130-
if (!conn)
1131-
DBLINK_CONN_NOT_AVAIL;
1113+
DBLINK_GET_NAMED_CONN;
11321114

11331115
msg=PQerrorMessage(conn);
1134-
if (!msg)
1116+
if (msg==NULL||msg[0]=='\0')
11351117
PG_RETURN_TEXT_P(GET_TEXT("OK"));
11361118
else
11371119
PG_RETURN_TEXT_P(GET_TEXT(msg));
@@ -2299,3 +2281,23 @@ deleteConnection(const char *name)
22992281
errmsg("undefined connection name")));
23002282

23012283
}
2284+
2285+
staticvoid
2286+
dblink_security_check(PGconn*conn,remoteConn*rconn)
2287+
{
2288+
if (!superuser())
2289+
{
2290+
if (!PQconnectionUsedPassword(conn))
2291+
{
2292+
PQfinish(conn);
2293+
if (rconn)
2294+
pfree(rconn);
2295+
2296+
ereport(ERROR,
2297+
(errcode(ERRCODE_S_R_E_PROHIBITED_SQL_STATEMENT_ATTEMPTED),
2298+
errmsg("password is required"),
2299+
errdetail("Non-superuser cannot connect if the server does not request a password."),
2300+
errhint("Target server's authentication method must be changed.")));
2301+
}
2302+
}
2303+
}

‎contrib/dblink/expected/dblink.out

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -724,6 +724,12 @@ SELECT dblink_get_connections();
724724
{dtest1,dtest2,dtest3}
725725
(1 row)
726726

727+
SELECT dblink_is_busy('dtest1');
728+
dblink_is_busy
729+
----------------
730+
0
731+
(1 row)
732+
727733
SELECT dblink_disconnect('dtest1');
728734
dblink_disconnect
729735
-------------------
@@ -758,3 +764,34 @@ SELECT * from result;
758764
10 | k | {a10,b10,c10}
759765
(11 rows)
760766

767+
SELECT dblink_connect('dtest1', 'dbname=contrib_regression');
768+
dblink_connect
769+
----------------
770+
OK
771+
(1 row)
772+
773+
SELECT * from
774+
dblink_send_query('dtest1', 'select * from foo where f1 < 3') as t1;
775+
t1
776+
----
777+
1
778+
(1 row)
779+
780+
SELECT dblink_cancel_query('dtest1');
781+
dblink_cancel_query
782+
---------------------
783+
OK
784+
(1 row)
785+
786+
SELECT dblink_error_message('dtest1');
787+
dblink_error_message
788+
----------------------
789+
OK
790+
(1 row)
791+
792+
SELECT dblink_disconnect('dtest1');
793+
dblink_disconnect
794+
-------------------
795+
OK
796+
(1 row)
797+

‎contrib/dblink/sql/dblink.sql

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -344,9 +344,18 @@ UNION
344344
ORDER by f1;
345345

346346
SELECT dblink_get_connections();
347+
SELECT dblink_is_busy('dtest1');
347348

348349
SELECT dblink_disconnect('dtest1');
349350
SELECT dblink_disconnect('dtest2');
350351
SELECT dblink_disconnect('dtest3');
352+
351353
SELECT*from result;
352354

355+
SELECT dblink_connect('dtest1','dbname=contrib_regression');
356+
SELECT*from
357+
dblink_send_query('dtest1','select * from foo where f1 < 3')as t1;
358+
359+
SELECT dblink_cancel_query('dtest1');
360+
SELECT dblink_error_message('dtest1');
361+
SELECT dblink_disconnect('dtest1');

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp