You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudberry.apache.org by le...@apache.org on 2026/10/06 16:39:31 UTC

(cloudberry) branch main updated: Disable COPY FROM PROGRAM under separate build-time option (#1956)

This is an automated email from the ASF dual-hosted git repository.

leborchuk pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/cloudberry.git


The following commit(s) were added to refs/heads/main by this push:
     new 626a7b105ab Disable COPY FROM PROGRAM under separate build-time option (#1956)
626a7b105ab is described below

commit 626a7b105abd7c68590b55e3c0d0fae910e6abaf
Author: reshke <re...@double.cloud>
AuthorDate: Tue Oct 6 21:39:25 2026 +0500

    Disable COPY FROM PROGRAM under separate build-time option (#1956)
    
    Co-authored-by: reshke <re...@qavm-273b4667.qemu>
---
 configure                      | 28 ++++++++++++++++++++++++++++
 configure.ac                   | 10 ++++++++++
 contrib/file_fdw/file_fdw.c    |  8 ++++++++
 doc/src/sgml/installation.sgml | 18 ++++++++++++++++--
 meson.build                    | 10 ++++++++++
 meson_options.txt              |  3 +++
 src/Makefile.global.in         |  1 +
 src/backend/commands/copy.c    |  8 ++++++++
 src/include/pg_config.h.in     |  3 +++
 src/include/pg_config.h.win32  |  3 +++
 src/tools/msvc/Solution.pm     |  1 +
 11 files changed, 91 insertions(+), 2 deletions(-)

diff --git a/configure b/configure
index 5e85f9056d4..53cad1742b1 100755
--- a/configure
+++ b/configure
@@ -796,6 +796,7 @@ CLANG
 LLVM_CONFIG
 AWK
 with_llvm
+with_copy_program
 SUN_STUDIO_CC
 ac_ct_CXX
 CXXFLAGS
@@ -904,6 +905,7 @@ with_segsize_blocks
 with_wal_blocksize
 with_CC
 with_llvm
+with_copy_program
 enable_depend
 enable_cassert
 enable_orca
@@ -1670,6 +1672,7 @@ Optional Packages:
                           set WAL block size in kB [8]
   --with-CC=CMD           set compiler (deprecated)
   --with-llvm             build with LLVM based JIT support
+  --without-copy-program  build without COPY TO/FROM PROGRAM support
   --without-icu           build without ICU support
   --with-tcl              build Tcl modules (PL/Tcl)
   --with-tclconfig=DIR    tclConfig.sh is in DIR
@@ -5380,6 +5383,31 @@ else
 fi
 
 
+# Check whether --with-copy-program was given.
+if test "${with_copy_program+set}" = set; then :
+  withval=$with_copy_program;
+  case $withval in
+    yes)
+
+$as_echo "#define USE_COPY_PROGRAM 1" >>confdefs.h
+
+      ;;
+    no)
+      :
+      ;;
+    *)
+      as_fn_error $? "no argument expected for --with-copy-program option" "$LINENO" 5
+      ;;
+  esac
+
+else
+  with_copy_program=yes
+
+$as_echo "#define USE_COPY_PROGRAM 1" >>confdefs.h
+
+fi
+
+
 
 for ac_prog in gawk mawk nawk awk
 do
diff --git a/configure.ac b/configure.ac
index 20ac3aa0f6d..1fadaa128dd 100644
--- a/configure.ac
+++ b/configure.ac
@@ -468,6 +468,16 @@ AS_IF([test "$with_llvm" = yes], [
   PGAC_LLVM_SUPPORT()
 ]) # fi
 
+#
+# --without-copy-program disables COPY TO/FROM PROGRAM
+#
+PGAC_ARG_BOOL(with, copy-program, yes,
+              [build with COPY TO/FROM PROGRAM support],
+              [AC_DEFINE([USE_COPY_PROGRAM], 1,
+                         [Define to 1 to build with COPY TO/FROM PROGRAM support. (--with-copy-program)])])
+AC_MSG_RESULT([checking whether to build with COPY PROGRAM... $with_copy_program])
+AC_SUBST(with_copy_program)
+
 
 unset CFLAGS
 unset CXXFLAGS
diff --git a/contrib/file_fdw/file_fdw.c b/contrib/file_fdw/file_fdw.c
index b5ffde4131b..70511892349 100644
--- a/contrib/file_fdw/file_fdw.c
+++ b/contrib/file_fdw/file_fdw.c
@@ -413,10 +413,18 @@ fileGetOptions(Oid foreigntableid,
 		}
 		else if (strcmp(def->defname, "program") == 0)
 		{
+#ifndef USE_COPY_PROGRAM
+			ereport(ERROR,
+					(errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
+					 errmsg("permission denied to use program option in file_fdw"),
+					 errhint("Anyone can COPY to stdout or from stdin. "
+							 "psql's \\copy command also works for anyone.")));
+#else
 			*filename = defGetString(def);
 			*is_program = true;
 			options = foreach_delete_current(options, lc);
 			break;
+#endif
 		}
 	}
 
diff --git a/doc/src/sgml/installation.sgml b/doc/src/sgml/installation.sgml
index c9904193d40..59c590c3d41 100644
--- a/doc/src/sgml/installation.sgml
+++ b/doc/src/sgml/installation.sgml
@@ -989,9 +989,23 @@ build-postgresql:
          environment variable).
         </para>
        </listitem>
-      </varlistentry>
+       </varlistentry>
+
+       <varlistentry id="configure-without-copy-program">
+        <term><option>--without-copy-program</option></term>
+        <listitem>
+         <para>
+          Build without support for <command>COPY TO/FROM PROGRAM</command>.
+          By default, this feature is enabled.  When built with
+          <option>--without-copy-program</option>, any attempt to use
+          <command>COPY</command> with the <literal>PROGRAM</literal>
+          option will result in an error, regardless of the user's
+          privileges.
+         </para>
+        </listitem>
+       </varlistentry>
 
-      <varlistentry id="configure-option-with-lz4">
+       <varlistentry id="configure-option-with-lz4">
        <term><option>--with-lz4</option></term>
        <listitem>
         <para>
diff --git a/meson.build b/meson.build
index 929d6c27be6..2bf8d5d70d7 100644
--- a/meson.build
+++ b/meson.build
@@ -817,6 +817,16 @@ endif
 
 
 
+###############################################################
+# Option: copy_program
+###############################################################
+
+if get_option('copy_program').enabled()
+  cdata.set('USE_COPY_PROGRAM', 1)
+endif
+
+
+
 ###############################################################
 # Library: icu
 ###############################################################
diff --git a/meson_options.txt b/meson_options.txt
index d2f95cfec36..d9d16829fa4 100644
--- a/meson_options.txt
+++ b/meson_options.txt
@@ -115,6 +115,9 @@ option('llvm', type: 'feature', value: 'disabled',
 option('lz4', type: 'feature', value: 'auto',
   description: 'LZ4 support')
 
+option('copy_program', type: 'feature', value: 'enabled',
+  description: 'COPY TO/FROM PROGRAM support')
+
 option('nls', type: 'feature', value: 'auto',
   description: 'Native language support')
 
diff --git a/src/Makefile.global.in b/src/Makefile.global.in
index f00f0be7091..ee1c76e0276 100644
--- a/src/Makefile.global.in
+++ b/src/Makefile.global.in
@@ -204,6 +204,7 @@ with_ldap	= @with_ldap@
 with_libxml	= @with_libxml@
 with_libxslt	= @with_libxslt@
 with_llvm	?= @with_llvm@
+with_copy_program ?= @with_copy_program@
 with_system_tzdata = @with_system_tzdata@
 with_uuid	= @with_uuid@
 with_zlib	= @with_zlib@
diff --git a/src/backend/commands/copy.c b/src/backend/commands/copy.c
index 30915b2a4cc..d037acca211 100644
--- a/src/backend/commands/copy.c
+++ b/src/backend/commands/copy.c
@@ -146,6 +146,7 @@ DoCopy(ParseState *pstate, const CopyStmt *stmt,
 	{
 		if (stmt->is_program)
 		{
+#ifdef USE_COPY_PROGRAM
 			if (!has_privs_of_role(GetUserId(), ROLE_PG_EXECUTE_SERVER_PROGRAM))
 				ereport(ERROR,
 						(errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
@@ -154,6 +155,13 @@ DoCopy(ParseState *pstate, const CopyStmt *stmt,
 								   "pg_execute_server_program"),
 						 errhint("Anyone can COPY to stdout or from stdin. "
 								 "psql's \\copy command also works for anyone.")));
+#else
+			ereport(ERROR,
+					(errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
+					 errmsg("permission denied to COPY to or from an external program"),
+					 errhint("Anyone can COPY to stdout or from stdin. "
+							 "psql's \\copy command also works for anyone.")));
+#endif
 		}
 		else
 		{
diff --git a/src/include/pg_config.h.in b/src/include/pg_config.h.in
index 72a27f363b4..677e5e7e423 100644
--- a/src/include/pg_config.h.in
+++ b/src/include/pg_config.h.in
@@ -880,6 +880,9 @@
    (--enable-link-postgres-with-shared) */
 #undef USE_LINK_POSTGRES_WITH_SHARED
 
+/* Define to 1 to build with COPY TO/FROM PROGRAM support. (--with-copy-program) */
+#undef USE_COPY_PROGRAM
+
 /* Define to 1 to build with LLVM based JIT support. (--with-llvm) */
 #undef USE_LLVM
 
diff --git a/src/include/pg_config.h.win32 b/src/include/pg_config.h.win32
index dc80f4ba040..291991258be 100644
--- a/src/include/pg_config.h.win32
+++ b/src/include/pg_config.h.win32
@@ -762,6 +762,9 @@
 /* Define to 1 to build with LDAP support. (--with-ldap) */
 /* #undef USE_LDAP */
 
+/* Define to 1 to build with COPY TO/FROM PROGRAM support. (--with-copy-program) */
+#define USE_COPY_PROGRAM 1
+
 /* Define to 1 to build with LLVM based JIT support. (--with-llvm) */
 /* #undef USE_LLVM */
 
diff --git a/src/tools/msvc/Solution.pm b/src/tools/msvc/Solution.pm
index db0b27e1067..7d5a759941d 100644
--- a/src/tools/msvc/Solution.pm
+++ b/src/tools/msvc/Solution.pm
@@ -435,6 +435,7 @@ sub GenerateFiles
 		USE_LZ4 => undef,
 		USE_LDAP => $self->{options}->{ldap} ? 1 : undef,
 		USE_LLVM => undef,
+		USE_COPY_PROGRAM => 1,
 		USE_NAMED_POSIX_SEMAPHORES => undef,
 		USE_OPENSSL => undef,
 		USE_PAM => undef,


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@cloudberry.apache.org
For additional commands, e-mail: commits-help@cloudberry.apache.org