#ifdef ALPHA
extern void printrusage32(struct tcb *, long);
#endif
-extern void printuid(const char *, unsigned long);
+extern void printuid(const char *, const unsigned int);
extern void print_sigset_addr_len(struct tcb *, long, long);
extern void printsignal(int);
extern void tprint_iov(struct tcb *, unsigned long, unsigned long, int decode_iov);
+caps
inet-accept-connect-send-recv
mmsg
net-accept-connect
sigaction
stack-fcall
statfs
+uid
+uid32
uio
*.log
*.log.*
sigaction \
stack-fcall \
statfs \
+ uid \
+ uid32 \
uio
statfs_CFLAGS = $(AM_CFLAGS) -D_FILE_OFFSET_BITS=64
net.test \
net-fd.test \
net-yy.test \
+ uid.test \
+ uid32.test \
uio.test \
count.test \
detach-sleeping.test \
net-yy-accept.awk \
net-yy-connect.awk \
sigaction.awk \
+ uid.awk \
$(TESTS)
CLEANFILES = $(TESTS:=.tmp)
--- /dev/null
+BEGIN {
+ ok = 0
+ fail = 0
+ r_uid = "(0|[1-9][0-9]*)"
+ r_getuid = "^getuid" suffix "\\(\\)[[:space:]]+= " r_uid "$"
+ r_setuid = "^/$"
+ r_getresuid = "^/$"
+ r_setreuid = "^/$"
+ r_setresuid = "^/$"
+ r_chown = "^/$"
+ s_last = "/"
+}
+
+ok == 1 {
+ fail = 1
+ next
+}
+
+$0 == s_last {
+ ok = 1
+ next
+}
+
+{
+ if (match($0, r_getuid, a)) {
+ r_uid = a[1]
+ r_setuid = "^setuid" suffix "\\(" r_uid "\\)[[:space:]]+= 0$"
+ next
+ }
+ if (match($0, r_setuid)) {
+ r_getresuid = "^getresuid" suffix "\\(\\[" r_uid "\\], \\[" r_uid "\\], \\[" r_uid "\\]\\)[[:space:]]+= 0$"
+ next
+ }
+ if (match($0, r_getresuid)) {
+ r_setreuid = "^setreuid" suffix "\\(-1, -1\\)[[:space:]]+= 0$"
+ next
+ }
+ if (match($0, r_setreuid)) {
+ r_setresuid = "^setresuid" suffix "\\(-1, " r_uid ", -1\\)[[:space:]]+= 0$"
+ next
+ }
+ if (match($0, r_setresuid)) {
+ r_chown = "^chown" suffix "\\(\".\", -1, -1\\)[[:space:]]+= 0$"
+ next
+ }
+ if (match($0, r_chown)) {
+ s_last = "+++ exited with 0 +++"
+ next
+ }
+ next
+}
+
+END {
+ if (fail) {
+ print "Unexpected output after exit"
+ exit 1
+ }
+ if (ok)
+ exit 0
+ if (r_setuid == "^/$") {
+ print "getuid doesn't match"
+ exit 1
+ }
+ if (r_getresuid == "^/$") {
+ print "setuid doesn't match"
+ exit 1
+ }
+ if (r_setreuid == "^/$") {
+ print "getresuid doesn't match"
+ exit 1
+ }
+ if (r_setresuid == "^/$") {
+ print "setreuid doesn't match"
+ exit 1
+ }
+ if (r_chown == "^/$") {
+ print "setresuid doesn't match"
+ exit 1
+ }
+ if (s_last == "/") {
+ print "chown doesn't match"
+ exit 1
+ }
+ print "The last line doesn't match"
+ exit 1
+}
--- /dev/null
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+#include <assert.h>
+#include <unistd.h>
+#include <sys/syscall.h>
+
+int
+main(void)
+{
+#if defined(__NR_getuid) \
+ && defined(__NR_setuid) \
+ && defined(__NR_getresuid) \
+ && defined(__NR_setreuid) \
+ && defined(__NR_setresuid) \
+ && defined(__NR_chown)
+ uid_t r, e, s;
+
+ e = syscall(__NR_getuid);
+ assert(syscall(__NR_setuid, e) == 0);
+ assert(syscall(__NR_getresuid, &r, &e, &s) == 0);
+ assert(syscall(__NR_setreuid, -1, -1L) == 0);
+ assert(syscall(__NR_setresuid, -1, e, -1L) == 0);
+ assert(syscall(__NR_chown, ".", -1, -1L) == 0);
+ return 0;
+#else
+ return 77;
+#endif
+}
--- /dev/null
+#!/bin/sh
+
+# Check uid decoding.
+
+. "${srcdir=.}/init.sh"
+
+check_prog awk
+
+s="${uid_syscall_suffix-}"
+w="${uid_t_size-}"
+uid="uid$s$w"
+./"$uid" || {
+ if [ $? -eq 77 ]; then
+ framework_skip_ "some uid$s or uid${w}_t syscalls are not available"
+ else
+ fail_ "$uid failed"
+ fi
+}
+
+syscalls="getuid$s,setuid$s,getresuid$s,setreuid$s,setresuid$s,chown$s"
+args="-e trace=$syscalls"
+$STRACE -o "$LOG" $args ./"$uid"|| {
+ cat "$LOG"
+ fail_ "$STRACE $args ./$uid failed"
+}
+
+awk -f "$srcdir"/uid.awk -v suffix="$s" "$LOG" || {
+ cat "$LOG"
+ fail_ 'unexpected output'
+}
+
+exit 0
--- /dev/null
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+#include <assert.h>
+#include <unistd.h>
+#include <sys/syscall.h>
+
+int
+main(void)
+{
+#if defined(__NR_getuid32) \
+ && defined(__NR_setuid32) \
+ && defined(__NR_getresuid32) \
+ && defined(__NR_setreuid32) \
+ && defined(__NR_setresuid32) \
+ && defined(__NR_chown32)
+ uid_t r, e, s;
+
+ e = syscall(__NR_getuid32);
+ assert(syscall(__NR_setuid32, e) == 0);
+ assert(syscall(__NR_getresuid32, &r, &e, &s) == 0);
+ assert(syscall(__NR_setreuid32, -1, -1L) == 0);
+ assert(syscall(__NR_setresuid32, -1, e, -1L) == 0);
+ assert(syscall(__NR_chown32, ".", -1, -1L) == 0);
+ return 0;
+#else
+ return 77;
+#endif
+}
--- /dev/null
+#!/bin/sh
+
+# Check uid32 decoding.
+
+uid_syscall_suffix=32
+
+. "${srcdir=.}/uid.test"
}
void
-printuid(const char *text, unsigned long uid)
+printuid(const char *text, const unsigned int uid)
{
- tprintf(((long) uid == -1) ? "%s%ld" : "%s%lu", text, uid);
+ if ((unsigned int) -1 == uid)
+ tprintf("%s-1", text);
+ else
+ tprintf("%s%u", text, uid);
}
/*