diff --git a/src/backend/distributed/executor/multi_utility.c b/src/backend/distributed/executor/multi_utility.c index 76f44f75c..3c0b5853f 100644 --- a/src/backend/distributed/executor/multi_utility.c +++ b/src/backend/distributed/executor/multi_utility.c @@ -635,6 +635,8 @@ IsTransmitStmt(Node *parsetree) static void VerifyTransmitStmt(CopyStmt *copyStatement) { + char *fileName = NULL; + /* do some minimal option verification */ if (copyStatement->relation == NULL || copyStatement->relation->relname == NULL) @@ -643,6 +645,20 @@ VerifyTransmitStmt(CopyStmt *copyStatement) errmsg("FORMAT 'transmit' requires a target file"))); } + fileName = copyStatement->relation->relname; + + if (is_absolute_path(fileName)) + { + ereport(ERROR, (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), + (errmsg("absolute path not allowed")))); + } + else if (!path_is_relative_and_below_cwd(fileName)) + { + ereport(ERROR, + (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), + (errmsg("path must be in or below the current directory")))); + } + if (copyStatement->filename != NULL) { ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE),