aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorElliott Hughes <enh@google.com>2015-01-14 03:43:49 -0600
committerElliott Hughes <enh@google.com>2015-01-14 03:43:49 -0600
commit50d320777a47132f07eb4e6707b7247f8db8861a (patch)
treef57f9e9e11835e35fbfea5274ef34722c63134c3
parent698a160868dba71766a8607b72a07eaa63d74da4 (diff)
downloadtoybox-50d320777a47132f07eb4e6707b7247f8db8861a.tar.gz
i found a few problems while manually smoke testing toybox chown versus toolbox (NetBSD) chown...
new test: and here's the patch to fix "owner:" ":group" and the ":" special case:
-rw-r--r--tests/chown.test41
-rw-r--r--toys/posix/chgrp.c4
2 files changed, 44 insertions, 1 deletions
diff --git a/tests/chown.test b/tests/chown.test
new file mode 100644
index 00000000..40ed7b5f
--- /dev/null
+++ b/tests/chown.test
@@ -0,0 +1,41 @@
+#!/bin/bash
+
+[ -f testing.sh ] && . testing.sh
+
+if [ "$(id -u)" -ne 0 ]
+then
+ echo "SKIPPED: chown (not root)"
+ continue 2>/dev/null
+ exit
+fi
+
+# We chown between user "root" and the last user in /etc/passwd,
+# and group "root" and the last group in /etc/group.
+
+USR="$(sed -n '$s/:.*//p' /etc/passwd)"
+GRP="$(sed -n '$s/:.*//p' /etc/group)"
+
+# Set up a little testing hierarchy
+
+rm -rf testdir &&
+mkdir testdir &&
+touch testdir/file
+F=testdir/file
+
+# Wrapper to reset groups and return results
+
+OUT="&& echo \$(ls -l testdir/file | awk '{print \$3,\$4}')"
+
+#testing "name" "command" "result" "infile" "stdin"
+
+# Basic smoketest
+testing "chown initial" "chown root:root $F $OUT" "root root\n" "" ""
+testing "chown usr:grp" "chown $USR:$GRP $F $OUT" "$USR $GRP\n" "" ""
+testing "chown root" "chown root $F $OUT" "root $GRP\n" "" ""
+# TODO: can we test "owner:"?
+testing "chown :grp" "chown root:root $F && chown :$GRP $F $OUT" \
+ "root $GRP\n" "" ""
+testing "chown :" "chown $USR:$GRP $F && chown : $F $OUT" \
+ "$USR $GRP\n" "" ""
+
+rm -rf testdir
diff --git a/toys/posix/chgrp.c b/toys/posix/chgrp.c
index dc7741bc..556b0f19 100644
--- a/toys/posix/chgrp.c
+++ b/toys/posix/chgrp.c
@@ -77,6 +77,8 @@ void chgrp_main(void)
int ischown = toys.which->name[2] == 'o', hl = toys.optflags&(FLAG_H|FLAG_L);
char **s, *own;
+ TT.owner = TT.group = -1;
+
// Distinguish chown from chgrp
if (ischown) {
char *grp;
@@ -97,7 +99,7 @@ void chgrp_main(void)
}
} else TT.group_name = *toys.optargs;
- if (TT.group_name) {
+ if (TT.group_name && *TT.group_name) {
struct group *g;
g = getgrnam(TT.group_name);
if (!g) g=getgrgid(atoi(TT.group_name));