diff --git a/configure.ac b/configure.ac index fb2228a6..7a83d8f3 100644 --- a/configure.ac +++ b/configure.ac @@ -237,15 +237,7 @@ AM_CONDITIONAL(INIT_STATE, test "$init_state" = "yes") # Setuid installations. -AC_CHECK_FUNC(setresuid, [HAVE_SETRESUID=1], [HAVE_SETRESUID=]) -if test "$HAVE_SETRESUID" = "1"; then - AC_DEFINE(HAVE_SETRESUID, 1, [whether we have setresuid()]) -fi - -AC_CHECK_FUNC(setreuid, [HAVE_SETREUID=1], [HAVE_SETREUID=]) -if test "$HAVE_SETREUID" = "1"; then - AC_DEFINE(HAVE_SETREUID, 1, [whether we have setreuid()]) -fi +AC_CHECK_FUNCS([setresuid setreuid lchown]) # This is needed if ATerm, Berkeley DB or bzip2 are static libraries, diff --git a/src/nix-setuid-helper/main.cc b/src/nix-setuid-helper/main.cc index 26cdc73b..168cff40 100644 --- a/src/nix-setuid-helper/main.cc +++ b/src/nix-setuid-helper/main.cc @@ -10,6 +10,7 @@ #include #include +#include "config.h" #include "util.hh" using namespace nix; @@ -46,8 +47,14 @@ static void secureChown(uid_t uidFrom, gid_t gidFrom, assert(uidTo != 0 && gidTo != 0); +#if HAVE_LCHOWN if (lchown(path.c_str(), uidTo, gidTo) == -1) throw Error(error); +#else + if (!S_ISLNK(st.st_mode) && + chown(path.c_str(), uidTo, gidTo) == -1) + throw Error(error); +#endif if (S_ISDIR(st.st_mode)) { Strings names = readDirectory(path);