ports/127210: chrooted install of a port does not fail when install fails

Nick Hibma nick at anywi.com
Mon Sep 8 15:20:01 UTC 2008


>Number:         127210
>Category:       ports
>Synopsis:       chrooted install of a port does not fail when install fails
>Confidential:   no
>Severity:       serious
>Priority:       high
>Responsible:    freebsd-ports-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Mon Sep 08 15:20:01 UTC 2008
>Closed-Date:
>Last-Modified:
>Originator:     Nick Hibma
>Release:        FreeBSD 7.0-STABLE i386
>Organization:
AnyWi Technologies
>Environment:
System: FreeBSD hind.van-laarhoven.org 7.0-STABLE FreeBSD 7.0-STABLE #3: Thu Aug 14 21:10:55 CEST 2008 toor at hind.van-laarhoven.org:/usr/src/sys/i386/compile/HIND i386

>Description:
	When doing 
		cd /usr/ports/archivers/arj
		make PREFIX=/path/to/root 
	in an incomplete world, the install fails (of course).
	But the make mentioned above succeeds. The error code is not passed back.

>How-To-Repeat:
	Create and install a world without a toolchain (using nanobsd for
	example) that misses gmake, install, strip, or another toolchain
	necessity.
	Use
		cd /usr/ports/archivers/arj
		make PREFIX=/path/to/root
		echo errorcode=$?
	And notice the 0 errorcode.
>Fix:

The problem is in the following code fragment from bsd.destdir.mk. Notice how it in all cases reaches the exit 0 at the end.
The call to chroot should be enclosed in an if statement

    ${CHROOT} $${_destdir} ${SH} -c "\
        cd $${PORTSDIR}${.CURDIR:S|^${PORTSDIR}||}; \
        ${SETENV} -i ${DESTDIR_ENV} $${_var_path_list} ${MAKE} ${.TARGETS}" && \
        ${ECHO_MSG} "===>  Chrooted make in ${DESTDIR} succeeded" || \
        ${ECHO_MSG} "===>  Chrooted make in ${DESTDIR} failed"; \
        ${ECHO_MSG} "===>  Cleaning up..."; \
    for _entry in $${_mounted_entries_list}; do \
        ${UMOUNT} -f $${_entry} || ${TRUE}; \
    done; \
    for _entry in $${_created_mountpoints_list}; do \
        ${RMDIR} $${_entry} || ${TRUE}; \
    done; \
    exit 0

should be (using an rc variable to return the correct exit value

    if ${CHROOT} $${_destdir} ${SH} -c "\
        cd $${PORTSDIR}${.CURDIR:S|^${PORTSDIR}||}; \
        ${SETENV} -i ${DESTDIR_ENV} $${_var_path_list} ${MAKE} ${.TARGETS}"; then \
        ${ECHO_MSG} "===>  Chrooted make in ${DESTDIR} succeeded" || \
	rc=0; \
    else; \
        ${ECHO_MSG} "===>  Chrooted make in ${DESTDIR} failed"; \
	rc=$?; \
    fi; \
    ${ECHO_MSG} "===>  Cleaning up..."; \
    for _entry in $${_mounted_entries_list}; do \
        ${UMOUNT} -f $${_entry} || ${TRUE}; \
    done; \
    for _entry in $${_created_mountpoints_list}; do \
        ${RMDIR} $${_entry} || ${TRUE}; \
    done; \
    exit $$rc

>Release-Note:
>Audit-Trail:
>Unformatted:



More information about the freebsd-ports-bugs mailing list