]> git.ipfire.org Git - thirdparty/coreutils.git/commitdiff
Use `id -u' to see if we're running as root,
authorJim Meyering <jim@meyering.net>
Sat, 19 Jul 2003 11:19:12 +0000 (11:19 +0000)
committerJim Meyering <jim@meyering.net>
Sat, 19 Jul 2003 11:19:12 +0000 (11:19 +0000)
rather than trying go write to an write-protected file.
When running as root, ensure $NON_ROOT_USERNAME is valid.
When running as root with `require-non-root', ensure that `.'
is writable by $NON_ROOT_USERNAME, then reinvoke $0 set-user-ID
to $NON_ROOT_USERNAME.  If `.' is not writable, then skip the test.

tests/priv-check

index 8770817904aec2763923943251bcbc94a098fc72..abb33602368d31fbc57a91d06242d1f5eab06730 100644 (file)
@@ -9,43 +9,33 @@ case "$PRIV_CHECK_ARG" in
      1>&2; exit 1;;
 esac
 
-priv_check_temp=priv-check.$$
-touch $priv_check_temp || framework_failure=1
-chmod a-w $priv_check_temp || framework_failure=1
+# Make sure id -u succeeds.
+my_uid=`id -u`
+test $? = 0 || {
+  echo "$0: cannot run \`id -u'" 1>&2
+  (exit 1); exit
+}
 
-# FIXME: use id -u, as below -- avoiding use of a temporary file
-(echo foo >> $priv_check_temp) >/dev/null 2>&1
-overwrite_status=$?
-give_msg=no
-case $PRIV_CHECK_ARG:$overwrite_status in
-  require-root:0) ;;
-  require-root:*) give_msg=yes ;;
-  require-non-root:0) give_msg=yes ;;
-  require-non-root:*) ;;
+# Make sure it gives valid output.
+case $my_uid in
+  *[^0-9]*)
+    echo "$0: invalid output (\`$my_uid') from \`id -u'" 1>&2
+    (exit 1); exit
+    ;;
+  *) ;;
 esac
 
-test $give_msg = yes && {
-  cat <<EOF
-***************************
-NOTICE:
-$0: This test is being skipped, since it works only
-when run $who.
-***************************
-EOF
-  rm -f $priv_check_temp
-  (exit 77); exit
-}
-
-test "$PRIV_CHECK_ARG" = require-root &&
+test $my_uid = 0 && \
 {
   # When running as root, always ensure that we have a valid non-root username.
+  # As non-root, don't do anything, since we won't be running setuidgid.
   : ${NON_ROOT_USERNAME=nobody}
 
   # Ensure that the supplied username is valid and with UID != 0.
-  coreutils_non_root_uid=`setuidgid $NON_ROOT_USERNAME id -u`
+  coreutils_non_root_uid=`id -u $NON_ROOT_USERNAME`
   test $? = 0 || \
     {
-      echo "$0: This command failed: \`setuidgid $NON_ROOT_USERNAME id -u'" 1>&2
+      echo "$0: This command failed: \`id -u $NON_ROOT_USERNAME'" 1>&2
       echo "$0: Skipping this test.  To enable it, set the envvar" 1>&2
       echo "$0: NON_ROOT_USERNAME to a non-root user name." 1>&2
       (exit 77); exit 77
@@ -58,4 +48,30 @@ test "$PRIV_CHECK_ARG" = require-root &&
     }
 }
 
-rm -f $priv_check_temp
+give_msg=no
+case $PRIV_CHECK_ARG:$my_uid in
+  require-root:0) ;;
+  require-root:*) give_msg=yes ;;
+  require-non-root:0)
+    # `.' must be writable by $NON_ROOT_USERNAME
+    setuidgid $NON_ROOT_USERNAME test -w . ||
+      {
+       echo "$0: `pwd`: not writable by user \`$NON_ROOT_USERNAME'" 1>&2
+       echo "$0: skipping this test" 1>&2
+       (exit 77); exit
+      }
+    exec setuidgid $NON_ROOT_USERNAME $0
+    ;;
+  require-non-root:*) ;;
+esac
+
+test $give_msg = yes && {
+  cat <<EOF
+***************************
+NOTICE:
+$0: This test is being skipped, since it works only
+when run $who.
+***************************
+EOF
+  (exit 77); exit
+}