Autoconf: Get --with-user and --with-chroot right. [skip appveyor]

As Francois-Xavier points it out, my commit 3aa6574 fixed one bug, but
introduced another: running "./configure --with-gcc" also erroneously
takes the --with-user code path because withval is set to "yes" after
the --with-gcc block:

./configure --with-gcc
[...]
checking whether to drop root privileges by default... configure:
  error: --with-user requires a username

The matter is, in Autoconf AC_ARG_WITH() without ation-if-not-given
assigns withval only if with_xxxx is set to any value (including an
empty string), so make sure withval is always set in AC_ARG_WITH() and
spell all possible withval values in AS_CASE(), this way regardless of
any other options the behaviour is correct.

Rejected:
--with-user
--with-user=
--with-user=yes
--with-chroot
--with-chroot=
--with-chroot=yes

Accepted:
--without-user
--with-user=no
--with-user=someuser
--without-chroot
--with-chroot=no
--with-chroot=/somedir
This commit is contained in:
Denis Ovsienko 2023-07-22 13:50:16 +01:00
parent b200ed9285
commit df376cdfb5

View File

@ -179,31 +179,42 @@ yes) AC_MSG_RESULT(yes)
;;
esac
AC_ARG_WITH(user, [ --with-user=USERNAME drop privileges by default to USERNAME])
AC_MSG_CHECKING([whether to drop root privileges by default])
if test ! -z "$withval" && test "$withval" != "no" ; then
if test "$withval" = "yes" ; then
AC_MSG_ERROR([--with-user requires a username])
fi
AC_DEFINE_UNQUOTED(WITH_USER, "$withval",
[define if should drop privileges by default])
AC_MSG_RESULT([yes, to user "$withval"])
else
AC_MSG_RESULT(no)
fi
AC_ARG_WITH(
[user],
[AS_HELP_STRING([--with-user=USERNAME],
[drop privileges by default to USERNAME]
)],
[],
[withval=no])
AS_CASE(["$withval"],
[no], [AC_MSG_RESULT(no)],
[''|yes], [AC_MSG_ERROR([--with-user requires a username])],
[
AC_DEFINE_UNQUOTED(WITH_USER, "$withval",
[define if should drop privileges by default])
AC_MSG_RESULT([yes, to user "$withval"])
]
)
AC_ARG_WITH(chroot, [ --with-chroot=DIRECTORY when dropping privileges, chroot to DIRECTORY])
AC_MSG_CHECKING([whether to chroot])
if test ! -z "$withval" && test "$withval" != "no" ; then
if test "$withval" = "yes" ; then
AC_MSG_ERROR([--with-chroot requires a directory])
fi
AC_DEFINE_UNQUOTED(WITH_CHROOT, "$withval",
[define if should chroot when dropping privileges])
AC_MSG_RESULT([yes, to directory "$withval"])
else
AC_MSG_RESULT(no)
fi
AC_ARG_WITH(
[chroot],
[AS_HELP_STRING([--with-chroot=DIRECTORY],
[when dropping privileges, chroot to DIRECTORY]
)],
[],
[withval=no]
)
AS_CASE(["$withval"],
[no], [AC_MSG_RESULT(no)],
[''|yes], [AC_MSG_ERROR([--with-chroot requires a directory])],
[
AC_DEFINE_UNQUOTED(WITH_CHROOT, "$withval",
[define if should chroot when dropping privileges])
AC_MSG_RESULT([yes, to directory "$withval"])
]
)
AC_ARG_WITH(sandbox-capsicum,
AS_HELP_STRING([--with-sandbox-capsicum],