diff --git a/contrib/dblink/dblink.c b/contrib/dblink/dblink.c index b19625bb9e..67a9d30d64 100644 --- a/contrib/dblink/dblink.c +++ b/contrib/dblink/dblink.c @@ -1002,6 +1002,9 @@ dblink_last_oid(PG_FUNCTION_ARGS) } +#ifndef SHRT_MAX +#define SHRT_MAX (0x7FFF) +#endif /* * dblink_build_sql_insert * @@ -1028,7 +1031,8 @@ dblink_build_sql_insert(PG_FUNCTION_ARGS) Oid relid; text *relname_text; int16 *pkattnums; - int16 pknumatts; + int pknumatts_tmp; + int16 pknumatts = 0; char **src_pkattvals; char **tgt_pkattvals; ArrayType *src_pkattvals_arry; @@ -1057,7 +1061,11 @@ dblink_build_sql_insert(PG_FUNCTION_ARGS) elog(ERROR, "dblink_build_sql_insert: relation does not exist"); pkattnums = (int16 *) PG_GETARG_POINTER(1); - pknumatts = PG_GETARG_INT16(2); + pknumatts_tmp = PG_GETARG_INT32(2); + if (pknumatts_tmp <= SHRT_MAX) + pknumatts = pknumatts_tmp; + else + elog(ERROR, "Bad input value for pknumatts; too large"); /* * There should be at least one key attribute @@ -1167,7 +1175,8 @@ dblink_build_sql_delete(PG_FUNCTION_ARGS) Oid relid; text *relname_text; int16 *pkattnums; - int16 pknumatts; + int pknumatts_tmp; + int16 pknumatts = 0; char **tgt_pkattvals; ArrayType *tgt_pkattvals_arry; int tgt_ndim; @@ -1191,7 +1200,11 @@ dblink_build_sql_delete(PG_FUNCTION_ARGS) elog(ERROR, "dblink_build_sql_delete: relation does not exist"); pkattnums = (int16 *) PG_GETARG_POINTER(1); - pknumatts = PG_GETARG_INT16(2); + pknumatts_tmp = PG_GETARG_INT32(2); + if (pknumatts_tmp <= SHRT_MAX) + pknumatts = pknumatts_tmp; + else + elog(ERROR, "Bad input value for pknumatts; too large"); /* * There should be at least one key attribute @@ -1274,7 +1287,8 @@ dblink_build_sql_update(PG_FUNCTION_ARGS) Oid relid; text *relname_text; int16 *pkattnums; - int16 pknumatts; + int pknumatts_tmp; + int16 pknumatts = 0; char **src_pkattvals; char **tgt_pkattvals; ArrayType *src_pkattvals_arry; @@ -1303,7 +1317,11 @@ dblink_build_sql_update(PG_FUNCTION_ARGS) elog(ERROR, "dblink_build_sql_update: relation does not exist"); pkattnums = (int16 *) PG_GETARG_POINTER(1); - pknumatts = PG_GETARG_INT16(2); + pknumatts_tmp = PG_GETARG_INT32(2); + if (pknumatts_tmp <= SHRT_MAX) + pknumatts = pknumatts_tmp; + else + elog(ERROR, "Bad input value for pknumatts; too large"); /* * There should be one source array key values for each key attnum diff --git a/contrib/dblink/dblink.sql.in b/contrib/dblink/dblink.sql.in index 9a2e05a20e..7f76ffc501 100644 --- a/contrib/dblink/dblink.sql.in +++ b/contrib/dblink/dblink.sql.in @@ -57,15 +57,15 @@ CREATE OR REPLACE FUNCTION dblink_get_pkey (text) RETURNS setof dblink_pkey_resu AS 'MODULE_PATHNAME','dblink_get_pkey' LANGUAGE 'c' WITH (isstrict); -CREATE OR REPLACE FUNCTION dblink_build_sql_insert (text, int2vector, int2, _text, _text) RETURNS text +CREATE OR REPLACE FUNCTION dblink_build_sql_insert (text, int2vector, int4, _text, _text) RETURNS text AS 'MODULE_PATHNAME','dblink_build_sql_insert' LANGUAGE 'c' WITH (isstrict); -CREATE OR REPLACE FUNCTION dblink_build_sql_delete (text, int2vector, int2, _text) RETURNS text +CREATE OR REPLACE FUNCTION dblink_build_sql_delete (text, int2vector, int4, _text) RETURNS text AS 'MODULE_PATHNAME','dblink_build_sql_delete' LANGUAGE 'c' WITH (isstrict); -CREATE OR REPLACE FUNCTION dblink_build_sql_update (text, int2vector, int2, _text, _text) RETURNS text +CREATE OR REPLACE FUNCTION dblink_build_sql_update (text, int2vector, int4, _text, _text) RETURNS text AS 'MODULE_PATHNAME','dblink_build_sql_update' LANGUAGE 'c' WITH (isstrict); @@ -82,8 +82,8 @@ GRANT EXECUTE ON FUNCTION dblink (text) TO PUBLIC; GRANT EXECUTE ON FUNCTION dblink_exec (text,text) TO PUBLIC; GRANT EXECUTE ON FUNCTION dblink_exec (text) TO PUBLIC; GRANT EXECUTE ON FUNCTION dblink_get_pkey (text) TO PUBLIC; -GRANT EXECUTE ON FUNCTION dblink_build_sql_insert (text, int2vector, int2, _text, _text) TO PUBLIC; -GRANT EXECUTE ON FUNCTION dblink_build_sql_delete (text, int2vector, int2, _text) TO PUBLIC; -GRANT EXECUTE ON FUNCTION dblink_build_sql_update (text, int2vector, int2, _text, _text) TO PUBLIC; +GRANT EXECUTE ON FUNCTION dblink_build_sql_insert (text, int2vector, int4, _text, _text) TO PUBLIC; +GRANT EXECUTE ON FUNCTION dblink_build_sql_delete (text, int2vector, int4, _text) TO PUBLIC; +GRANT EXECUTE ON FUNCTION dblink_build_sql_update (text, int2vector, int4, _text, _text) TO PUBLIC; GRANT EXECUTE ON FUNCTION dblink_current_query () TO PUBLIC;