Subject: Re: Doesn't drop privileges
To: None <tech-pkg@NetBSD.org>
From: Alan Barrett <apb@cequrux.com>
List: tech-pkg
Date: 09/02/2006 18:55:27
On Fri, 01 Sep 2006, César Catrián Carreño wrote:
> When the following variables are set:
> 
> BINPKG_SITES=""
> DEPENDS_TARGET=bin-install
> 
> pkgsrc goes to root for installing the dependent package.
> If that package doesn't exist, tries to build it.
> Nevertheless, it doesn't drop the privileges in this situation.

This is a long-standing problem.  Once again, I offer my patches to
make bin-install become root only for the pkg_add command, not for
the entire build.

--apb (Alan Barrett)

Index: mk/install/bin-install.mk
===================================================================
--- mk/install/bin-install.mk	9 Aug 2006 15:31:01 -0000	1.4
+++ mk/install/bin-install.mk	2 Sep 2006 16:36:31 -0000
@@ -24,7 +24,7 @@
 	ftp://ftp.NetBSD.org/pub/NetBSD/packages/$${rel}/$${arch}
 
 _SU_BIN_INSTALL_TARGETS=	acquire-bin-install-lock
-_SU_BIN_INSTALL_TARGETS+=	locked-su-bin-install
+_SU_BIN_INSTALL_TARGETS+=	locked-su-bin-install-pkgadd
 _SU_BIN_INSTALL_TARGETS+=	release-bin-install-lock
 
 .PHONY: acquire-bin-install-lock release-bin-install-lock
@@ -32,34 +32,44 @@
 release-bin-install-lock: release-localbase-lock
 
 # Install binary pkg, without strict uptodate-check first
-.PHONY: su-bin-install
-su-bin-install: ${_SU_BIN_INSTALL_TARGETS}
+.PHONY: su-bin-install-pkgadd
+su-bin-install-pkgadd: ${_SU_BIN_INSTALL_TARGETS}
 
-locked-su-bin-install:
+locked-su-bin-install-pkgadd:
+	${SETENV} PKG_PATH="$$pkgpath" ${PKG_ADD} ${_BIN_INSTALL_FLAGS} ${PKGNAME_REQD:U${PKGNAME}:Q}${PKG_SUFX}
+
+# bin-install
+
+bin-install:
+	@${PHASE_MSG} "Binary install for "${PKGNAME_REQD:U${PKGNAME}:Q}
 	@found=`${PKG_BEST_EXISTS} \"${PKGWILDCARD}\" || ${TRUE}`;	\
-	if [ "$$found" != "" ]; then					\
+	if [ "$$found" = "${PKGNAME}" ]; then				\
+		: "XXX: APB" ;						\
+		${ECHO_MSG} "${_PKGSRC_IN}> $$found is already installed."; \
+		${SHCOMMENT} "This is not an error.";			\
+	elif [ "$$found" != "" ]; then					\
 		${ERROR_MSG} "$$found is already installed - perhaps an older version?"; \
 		${ERROR_MSG} "If so, you may wish to \`\`pkg_delete $$found'' and install"; \
 		${ERROR_MSG} "this package again by \`\`${MAKE} bin-install'' to upgrade it properly."; \
 		exit 1;							\
 	fi
-	@rel=${_SHORT_UNAME_R:Q};					\
+	rel=${_SHORT_UNAME_R:Q};					\
 	arch=${MACHINE_ARCH:Q};						\
 	pkgpath=${PKGREPOSITORY:Q};					\
 	for i in ${BINPKG_SITES}; do					\
 		pkgpath="$$pkgpath;$$i/All";				\
 	done;								\
+	export pkgpath;							\
 	${STEP_MSG} "Installing ${PKGNAME} from $$pkgpath";		\
-	if ${SETENV} PKG_PATH="$$pkgpath" ${PKG_ADD} ${_BIN_INSTALL_FLAGS} ${PKGNAME_REQD:U${PKGNAME}:Q}${PKG_SUFX}; then \
+	if ${RECURSIVE_MAKE} ${MAKEFLAGS} bin-install-pkgadd ; then \
 		${ECHO} "`${PKG_INFO} -e ${PKGNAME_REQD:U${PKGNAME}:Q}` successfully installed."; \
 	else 				 				\
 		${SHCOMMENT} "Cycle through some FTP server here";	\
 		${STEP_MSG} "No binary package found for ${PKGNAME} -- installing from source"; \
 		${RECURSIVE_MAKE} ${MAKEFLAGS} package			\
 			DEPENDS_TARGET=${DEPENDS_TARGET:Q}		\
-		&& ${RECURSIVE_MAKE} ${MAKEFLAGS} clean;		\
+		&& : ${RECURSIVE_MAKE} ${MAKEFLAGS} clean;		\
 	fi
 
-.PHONY: bin-install
-bin-install: su-target
-	@${PHASE_MSG} "Binary install for "${PKGNAME_REQD:U${PKGNAME}:Q}
+.PHONY: bin-install-pkgadd
+bin-install-pkgadd: su-target