get_robust_list.c \
getcpu.c \
getcwd.c \
- groups.c \
hostname.c \
inotify.c \
io.c \
+++ /dev/null
-#include "defs.h"
-
-#include <asm/posix_types.h>
-#undef GETGROUPS_T
-#define GETGROUPS_T __kernel_gid_t
-#undef GETGROUPS32_T
-#define GETGROUPS32_T __kernel_gid32_t
-
-int
-sys_setgroups(struct tcb *tcp)
-{
- if (entering(tcp)) {
- unsigned long len, size, start, cur, end, abbrev_end;
- GETGROUPS_T gid;
- int failed = 0;
-
- len = tcp->u_arg[0];
- tprintf("%lu, ", len);
- if (len == 0) {
- tprints("[]");
- return 0;
- }
- start = tcp->u_arg[1];
- if (start == 0) {
- tprints("NULL");
- return 0;
- }
- size = len * sizeof(gid);
- end = start + size;
- if (!verbose(tcp) || size / sizeof(gid) != len || end < start) {
- tprintf("%#lx", start);
- return 0;
- }
- if (abbrev(tcp)) {
- abbrev_end = start + max_strlen * sizeof(gid);
- if (abbrev_end < start)
- abbrev_end = end;
- } else {
- abbrev_end = end;
- }
- tprints("[");
- for (cur = start; cur < end; cur += sizeof(gid)) {
- if (cur > start)
- tprints(", ");
- if (cur >= abbrev_end) {
- tprints("...");
- break;
- }
- if (umoven(tcp, cur, sizeof(gid), (char *) &gid) < 0) {
- tprints("?");
- failed = 1;
- break;
- }
- tprintf("%lu", (unsigned long) gid);
- }
- tprints("]");
- if (failed)
- tprintf(" %#lx", tcp->u_arg[1]);
- }
- return 0;
-}
-
-int
-sys_getgroups(struct tcb *tcp)
-{
- unsigned long len;
-
- if (entering(tcp)) {
- len = tcp->u_arg[0];
- tprintf("%lu, ", len);
- } else {
- unsigned long size, start, cur, end, abbrev_end;
- GETGROUPS_T gid;
- int failed = 0;
-
- len = tcp->u_rval;
- if (len == 0) {
- tprints("[]");
- return 0;
- }
- start = tcp->u_arg[1];
- if (start == 0) {
- tprints("NULL");
- return 0;
- }
- if (tcp->u_arg[0] == 0) {
- tprintf("%#lx", start);
- return 0;
- }
- size = len * sizeof(gid);
- end = start + size;
- if (!verbose(tcp) || tcp->u_arg[0] == 0 ||
- size / sizeof(gid) != len || end < start) {
- tprintf("%#lx", start);
- return 0;
- }
- if (abbrev(tcp)) {
- abbrev_end = start + max_strlen * sizeof(gid);
- if (abbrev_end < start)
- abbrev_end = end;
- } else {
- abbrev_end = end;
- }
- tprints("[");
- for (cur = start; cur < end; cur += sizeof(gid)) {
- if (cur > start)
- tprints(", ");
- if (cur >= abbrev_end) {
- tprints("...");
- break;
- }
- if (umoven(tcp, cur, sizeof(gid), (char *) &gid) < 0) {
- tprints("?");
- failed = 1;
- break;
- }
- tprintf("%lu", (unsigned long) gid);
- }
- tprints("]");
- if (failed)
- tprintf(" %#lx", tcp->u_arg[1]);
- }
- return 0;
-}
-
-int
-sys_setgroups32(struct tcb *tcp)
-{
- if (entering(tcp)) {
- unsigned long len, size, start, cur, end, abbrev_end;
- GETGROUPS32_T gid;
- int failed = 0;
-
- len = tcp->u_arg[0];
- tprintf("%lu, ", len);
- if (len == 0) {
- tprints("[]");
- return 0;
- }
- start = tcp->u_arg[1];
- if (start == 0) {
- tprints("NULL");
- return 0;
- }
- size = len * sizeof(gid);
- end = start + size;
- if (!verbose(tcp) || size / sizeof(gid) != len || end < start) {
- tprintf("%#lx", start);
- return 0;
- }
- if (abbrev(tcp)) {
- abbrev_end = start + max_strlen * sizeof(gid);
- if (abbrev_end < start)
- abbrev_end = end;
- } else {
- abbrev_end = end;
- }
- tprints("[");
- for (cur = start; cur < end; cur += sizeof(gid)) {
- if (cur > start)
- tprints(", ");
- if (cur >= abbrev_end) {
- tprints("...");
- break;
- }
- if (umoven(tcp, cur, sizeof(gid), (char *) &gid) < 0) {
- tprints("?");
- failed = 1;
- break;
- }
- tprintf("%lu", (unsigned long) gid);
- }
- tprints("]");
- if (failed)
- tprintf(" %#lx", tcp->u_arg[1]);
- }
- return 0;
-}
-
-int
-sys_getgroups32(struct tcb *tcp)
-{
- unsigned long len;
-
- if (entering(tcp)) {
- len = tcp->u_arg[0];
- tprintf("%lu, ", len);
- } else {
- unsigned long size, start, cur, end, abbrev_end;
- GETGROUPS32_T gid;
- int failed = 0;
-
- len = tcp->u_rval;
- if (len == 0) {
- tprints("[]");
- return 0;
- }
- start = tcp->u_arg[1];
- if (start == 0) {
- tprints("NULL");
- return 0;
- }
- size = len * sizeof(gid);
- end = start + size;
- if (!verbose(tcp) || tcp->u_arg[0] == 0 ||
- size / sizeof(gid) != len || end < start) {
- tprintf("%#lx", start);
- return 0;
- }
- if (abbrev(tcp)) {
- abbrev_end = start + max_strlen * sizeof(gid);
- if (abbrev_end < start)
- abbrev_end = end;
- } else {
- abbrev_end = end;
- }
- tprints("[");
- for (cur = start; cur < end; cur += sizeof(gid)) {
- if (cur > start)
- tprints(", ");
- if (cur >= abbrev_end) {
- tprints("...");
- break;
- }
- if (umoven(tcp, cur, sizeof(gid), (char *) &gid) < 0) {
- tprints("?");
- failed = 1;
- break;
- }
- tprintf("%lu", (unsigned long) gid);
- }
- tprints("]");
- if (failed)
- tprintf(" %#lx", tcp->u_arg[1]);
- }
- return 0;
-}
{ 2, 0, sys_getrusage, "getrusage" }, /* 77 */
{ 2, 0, sys_gettimeofday, "gettimeofday" }, /* 78 */
{ 2, 0, sys_settimeofday, "settimeofday" }, /* 79 */
- { 2, 0, sys_getgroups, "getgroups" }, /* 80 */
- { 2, 0, sys_setgroups, "setgroups" }, /* 81 */
+ { 2, 0, sys_getgroups16, "getgroups" }, /* 80 */
+ { 2, 0, sys_setgroups16, "setgroups" }, /* 81 */
{ 1, TD, sys_oldselect, "oldselect" }, /* 82 */
{ 2, TF, sys_symlink, "symlink" }, /* 83 */
{ 2, TF, sys_oldlstat, "oldlstat" }, /* 84 */
{ 0, NF, sys_geteuid, "getegid32" }, /* 202 */
{ 2, 0, sys_setreuid, "setreuid32" }, /* 203 */
{ 2, 0, sys_setregid, "setregid32" }, /* 204 */
- { 2, 0, sys_getgroups32, "getgroups32" }, /* 205 */
- { 2, 0, sys_setgroups32, "setgroups32" }, /* 206 */
+ { 2, 0, sys_getgroups, "getgroups32" }, /* 205 */
+ { 2, 0, sys_setgroups, "setgroups32" }, /* 206 */
{ 3, TD, sys_fchown, "fchown32" }, /* 207 */
{ 3, 0, sys_setresuid, "setresuid32" }, /* 208 */
{ 3, 0, sys_getresuid, "getresuid32" }, /* 209 */
{ 2, 0, sys_getrusage, "getrusage" }, /* 77 */
{ 2, 0, sys_gettimeofday, "gettimeofday" }, /* 78 */
{ 2, 0, sys_settimeofday, "settimeofday" }, /* 79 */
- { 2, 0, sys_getgroups, "getgroups" }, /* 80 */
- { 2, 0, sys_setgroups, "setgroups" }, /* 81 */
+ { 2, 0, sys_getgroups16, "getgroups" }, /* 80 */
+ { 2, 0, sys_setgroups16, "setgroups" }, /* 81 */
{ 1, TD, sys_oldselect, "oldselect" }, /* 82 */
{ 2, TF, sys_symlink, "symlink" }, /* 83 */
{ 2, TF, sys_oldlstat, "oldlstat" }, /* 84 */
{ 0, NF, sys_geteuid, "getegid32" }, /* 202 */
{ 2, 0, sys_setreuid, "setreuid32" }, /* 203 */
{ 2, 0, sys_setregid, "setregid32" }, /* 204 */
- { 2, 0, sys_getgroups32, "getgroups32" }, /* 205 */
- { 2, 0, sys_setgroups32, "setgroups32" }, /* 206 */
+ { 2, 0, sys_getgroups, "getgroups32" }, /* 205 */
+ { 2, 0, sys_setgroups, "setgroups32" }, /* 206 */
{ 3, TD, sys_fchown, "fchown32" }, /* 207 */
{ 3, 0, sys_setresuid, "setresuid32" }, /* 208 */
{ 3, 0, sys_getresuid, "getresuid32" }, /* 209 */
{ 2, 0, sys_getrusage, "getrusage" }, /* 77 */
{ 2, 0, sys_gettimeofday, "gettimeofday" }, /* 78 */
{ 2, 0, sys_settimeofday, "settimeofday" }, /* 79 */
- { 2, 0, sys_getgroups, "getgroups" }, /* 80 */
- { 2, 0, sys_setgroups, "setgroups" }, /* 81 */
+ { 2, 0, sys_getgroups16, "getgroups" }, /* 80 */
+ { 2, 0, sys_setgroups16, "setgroups" }, /* 81 */
{ 1, TD, sys_oldselect, "oldselect" }, /* 82 */
{ 2, TF, sys_symlink, "symlink" }, /* 83 */
{ 2, TF, sys_oldlstat, "oldlstat" }, /* 84 */
{ 0, NF, sys_getegid, "getegid32" }, /* 202 */
{ 2, 0, sys_setreuid, "setreuid32" }, /* 203 */
{ 2, 0, sys_setregid, "setregid32" }, /* 204 */
- { 2, 0, sys_getgroups32, "getgroups32" }, /* 205 */
- { 2, 0, sys_setgroups32, "setgroups32" }, /* 206 */
+ { 2, 0, sys_getgroups, "getgroups32" }, /* 205 */
+ { 2, 0, sys_setgroups, "setgroups32" }, /* 206 */
{ 3, TD, sys_fchown, "fchown32" }, /* 207 */
{ 3, 0, sys_setresuid, "setresuid32" }, /* 208 */
{ 3, 0, sys_getresuid, "getresuid32" }, /* 209 */
{ 2, 0, sys_getrusage, "getrusage" }, /* 77 */
{ 2, 0, sys_gettimeofday, "gettimeofday" }, /* 78 */
{ 2, 0, sys_settimeofday, "settimeofday" }, /* 79 */
- { 2, 0, sys_getgroups, "getgroups" }, /* 80 */
- { 2, 0, sys_setgroups, "setgroups" }, /* 81 */
+ { 2, 0, sys_getgroups16, "getgroups" }, /* 80 */
+ { 2, 0, sys_setgroups16, "setgroups" }, /* 81 */
{ 1, TD, sys_oldselect, "oldselect" }, /* 82 */
{ 2, TF, sys_symlink, "symlink" }, /* 83 */
{ 2, TF, sys_oldlstat, "oldlstat" }, /* 84 */
{ 0, NF, sys_geteuid, "getegid32" }, /* 202 */
{ 2, 0, sys_setreuid, "setreuid32" }, /* 203 */
{ 2, 0, sys_setregid, "setregid32" }, /* 204 */
- { 2, 0, sys_getgroups32, "getgroups32" }, /* 205 */
- { 2, 0, sys_setgroups32, "setgroups32" }, /* 206 */
+ { 2, 0, sys_getgroups, "getgroups32" }, /* 205 */
+ { 2, 0, sys_setgroups, "setgroups32" }, /* 206 */
{ 3, TD, sys_fchown, "fchown32" }, /* 207 */
{ 3, 0, sys_setresuid, "setresuid32" }, /* 208 */
{ 3, 0, sys_getresuid, "getresuid32" }, /* 209 */
{ 2, 0, sys_getrusage, "getrusage" }, /* 77 */
{ 2, 0, sys_gettimeofday, "gettimeofday" }, /* 78 */
{ 2, 0, sys_settimeofday, "settimeofday" }, /* 79 */
- { 2, 0, sys_getgroups, "getgroups" }, /* 80 */
- { 2, 0, sys_setgroups, "setgroups" }, /* 81 */
+ { 2, 0, sys_getgroups16, "getgroups" }, /* 80 */
+ { 2, 0, sys_setgroups16, "setgroups" }, /* 81 */
{ 1, TD, sys_oldselect, "oldselect" }, /* 82 */
{ 2, TF, sys_symlink, "symlink" }, /* 83 */
{ 2, TF, sys_oldlstat, "oldlstat" }, /* 84 */
{ 0, NF, sys_geteuid, "getegid32" }, /* 202 */
{ 2, 0, sys_setreuid, "setreuid32" }, /* 203 */
{ 2, 0, sys_setregid, "setregid32" }, /* 204 */
- { 2, 0, sys_getgroups32, "getgroups32" }, /* 205 */
- { 2, 0, sys_setgroups32, "setgroups32" }, /* 206 */
+ { 2, 0, sys_getgroups, "getgroups32" }, /* 205 */
+ { 2, 0, sys_setgroups, "setgroups32" }, /* 206 */
{ 3, TD, sys_fchown, "fchown32" }, /* 207 */
{ 3, 0, sys_setresuid, "setresuid32" }, /* 208 */
{ 3, 0, sys_getresuid, "getresuid32" }, /* 209 */
{ 2, 0, sys_getrusage, "getrusage" }, /* 77 */
{ 2, 0, sys_gettimeofday, "gettimeofday" }, /* 78 */
{ 2, 0, sys_settimeofday, "settimeofday" }, /* 79 */
- { 2, 0, sys_getgroups, "getgroups" }, /* 80 */
- { 2, 0, sys_setgroups, "setgroups" }, /* 81 */
+ { 2, 0, sys_getgroups16, "getgroups" }, /* 80 */
+ { 2, 0, sys_setgroups16, "setgroups" }, /* 81 */
{ MA, 0, NULL, NULL }, /* 82 */
{ 2, TF, sys_symlink, "symlink" }, /* 83 */
{ MA, 0, NULL, NULL }, /* 84 */
{ 2, 0, sys_getrusage, "getrusage" }, /* 77 */
{ 2, 0, sys_gettimeofday, "gettimeofday" }, /* 78 */
{ 2, 0, sys_settimeofday, "settimeofday" }, /* 79 */
- { 2, 0, sys_getgroups, "getgroups" }, /* 80 */
- { 2, 0, sys_setgroups, "setgroups" }, /* 81 */
+ { 2, 0, sys_getgroups16, "getgroups" }, /* 80 */
+ { 2, 0, sys_setgroups16, "setgroups" }, /* 81 */
{ 1, TD, sys_oldselect, "oldselect" }, /* 82 */
{ 2, TF, sys_symlink, "symlink" }, /* 83 */
{ 2, TF, sys_oldlstat, "oldlstat" }, /* 84 */
{ 0, 0, sys_getegid, "getegid32" }, /* 202 */
{ 2, 0, sys_setreuid, "setreuid32" }, /* 203 */
{ 2, 0, sys_setregid, "setregid32" }, /* 204 */
- { 2, 0, sys_getgroups32, "getgroups32" }, /* 205 */
- { 2, 0, sys_setgroups32, "setgroups32" }, /* 206 */
+ { 2, 0, sys_getgroups, "getgroups32" }, /* 205 */
+ { 2, 0, sys_setgroups, "setgroups32" }, /* 206 */
{ 3, 0, sys_fchown, "fchown32" }, /* 207 */
{ 3, 0, sys_setresuid, "setresuid32" }, /* 208 */
{ 3, 0, sys_getresuid, "getresuid32" }, /* 209 */
{ 2, 0, sys_getrusage, "getrusage" }, /* 77 */
{ 2, 0, sys_gettimeofday, "gettimeofday" }, /* 78 */
{ 2, 0, sys_settimeofday, "settimeofday" }, /* 79 */
- { 2, 0, sys_getgroups, "getgroups" }, /* 80 */
- { 2, 0, sys_setgroups, "setgroups" }, /* 81 */
+ { 2, 0, sys_getgroups16, "getgroups" }, /* 80 */
+ { 2, 0, sys_setgroups16, "setgroups" }, /* 81 */
{ 1, TD, sys_oldselect, "oldselect" }, /* 82 */
{ 2, TF, sys_symlink, "symlink" }, /* 83 */
{ 2, TF, sys_oldlstat, "oldlstat" }, /* 84 */
{ 0, 0, sys_getegid, "getegid32" }, /* 202 */
{ 2, 0, sys_setreuid, "setreuid32" }, /* 203 */
{ 2, 0, sys_setregid, "setregid32" }, /* 204 */
- { 2, 0, sys_getgroups32, "getgroups32" }, /* 205 */
- { 2, 0, sys_setgroups32, "setgroups32" }, /* 206 */
+ { 2, 0, sys_getgroups, "getgroups32" }, /* 205 */
+ { 2, 0, sys_setgroups, "setgroups32" }, /* 206 */
{ 3, 0, sys_fchown, "fchown32" }, /* 207 */
{ 3, 0, sys_setresuid, "setresuid32" }, /* 208 */
{ 3, 0, sys_getresuid, "getresuid32" }, /* 209 */
{ 0, 0, sys_vhangup, "vhangup" }, /* 76 */
{ 3, TF, sys_truncate64, "truncate64" }, /* 77 */
{ 3, TM, sys_mincore, "mincore" }, /* 78 */
- { 2, 0, sys_getgroups, "getgroups" }, /* 79 */
- { 2, 0, sys_setgroups, "setgroups" }, /* 80 */
+ { 2, 0, sys_getgroups16,"getgroups" }, /* 79 */
+ { 2, 0, sys_setgroups16,"setgroups" }, /* 80 */
{ 0, 0, sys_getpgrp, "getpgrp" }, /* 81 */
- { 2, 0, sys_setgroups32,"setgroups32" }, /* 82 */
+ { 2, 0, sys_setgroups, "setgroups32" }, /* 82 */
{ 3, 0, sys_setitimer, "setitimer" }, /* 83 */
{ 3, TD, sys_ftruncate64,"ftruncate64" }, /* 84 */
{ 2, TF, sys_swapon, "swapon" }, /* 85 */
{ 2, 0, sys_setregid, "setregid32" }, /* 112 */
{ 3, TN, sys_recvmsg, "recvmsg" }, /* 113 */
{ 3, TN, sys_sendmsg, "sendmsg" }, /* 114 */
- { 2, 0, sys_getgroups32,"getgroups32" }, /* 115 */
+ { 2, 0, sys_getgroups, "getgroups32" }, /* 115 */
{ 2, 0, sys_gettimeofday,"gettimeofday" }, /* 116 */
{ 2, 0, sys_getrusage, "getrusage" }, /* 117 */
{ 5, TN, sys_getsockopt, "getsockopt" }, /* 118 */
int sys_getdents64();
int sys_getdtablesize();
int sys_getgroups();
-int sys_getgroups32();
int sys_gethostname();
int sys_getitimer();
int sys_getpmsg(); /* TODO: non-Linux, remove? */
int sys_set_thread_area();
int sys_setfsuid();
int sys_setgroups();
-int sys_setgroups32();
int sys_sethostname();
int sys_setitimer();
int sys_setns();
#if NEED_UID16_PARSERS
int sys_chown16();
int sys_fchown16();
+int sys_getgroups16();
int sys_getresuid16();
int sys_getuid16();
int sys_setfsuid16();
+int sys_setgroups16();
int sys_setresuid16();
int sys_setreuid16();
int sys_setuid16();
regexp = "^chown" suffix "\\(\".\", -1, -1\\)[[:space:]]+= 0$"
next
case "chown":
+ expected = "1st getgroups"
+ regexp = "^getgroups" suffix "\\(0, NULL\\)[[:space:]]+= " r_uint "$"
+ next
+ case "1st getgroups":
+ ngroups = a[1]
+ switch (ngroups) {
+ case "0": list=""; break
+ case "1": list=r_uint; break
+ default: list=r_uint "(, " r_uint "){" (ngroups - 1) "}"
+ }
+ expected = "2nd getgroups"
+ regexp = "^getgroups" suffix "\\(" ngroups ", \\[" list "\\]\\)[[:space:]]+= " ngroups "$"
+ next
+ case "2nd getgroups":
expected = "the last line"
regexp = "^\\+\\+\\+ exited with 0 \\+\\+\\+$"
next
# include "config.h"
#endif
#include <assert.h>
+#include <stdlib.h>
#include <unistd.h>
#include <sys/syscall.h>
&& defined(__NR_getresuid) \
&& defined(__NR_setreuid) \
&& defined(__NR_setresuid) \
- && defined(__NR_chown)
- uid_t r, e, s;
+ && defined(__NR_chown) \
+ && defined(__NR_getgroups)
+ int r, e, s;
+ int size;
+ int *list = 0;
e = syscall(__NR_getuid);
assert(syscall(__NR_setuid, e) == 0);
assert(syscall(__NR_setreuid, -1, -1L) == 0);
assert(syscall(__NR_setresuid, -1, e, -1L) == 0);
assert(syscall(__NR_chown, ".", -1, -1L) == 0);
+ assert((size = syscall(__NR_getgroups, 0, list)) >= 0);
+ assert(list = calloc(size + 1, sizeof(*list)));
+ assert(syscall(__NR_getgroups, size, list) == size);
return 0;
#else
return 77;
fi
}
-syscalls="getuid$s,setuid$s,getresuid$s,setreuid$s,setresuid$s,chown$s"
+syscalls="getuid$s,setuid$s,getresuid$s,setreuid$s,setresuid$s,chown$s,getgroups$s"
args="-e trace=$syscalls"
$STRACE -o "$LOG" $args ./"$uid"|| {
cat "$LOG"
# include "config.h"
#endif
#include <assert.h>
+#include <stdlib.h>
#include <unistd.h>
#include <sys/syscall.h>
&& defined(__NR_setreuid) \
&& defined(__NR_setresuid) \
&& defined(__NR_chown) \
+ && defined(__NR_getgroups) \
\
&& defined(__NR_getuid32) \
&& defined(__NR_setuid32) \
&& defined(__NR_setreuid32) \
&& defined(__NR_setresuid32) \
&& defined(__NR_chown32) \
+ && defined(__NR_getgroups32) \
\
&& __NR_getuid != __NR_getuid32 \
&& __NR_setuid != __NR_setuid32 \
&& __NR_setreuid != __NR_setreuid32 \
&& __NR_setresuid != __NR_setresuid32 \
&& __NR_chown != __NR_chown32 \
+ && __NR_getgroups != __NR_getgroups32 \
/**/
- uid_t r, e, s;
+ int r, e, s;
+ int size;
+ int *list = 0;
e = syscall(__NR_getuid);
assert(syscall(__NR_setuid, e) == 0);
assert(syscall(__NR_setreuid, -1, 0xffff) == 0);
assert(syscall(__NR_setresuid, -1, e, 0xffff) == 0);
assert(syscall(__NR_chown, ".", -1, 0xffff) == 0);
+ assert((size = syscall(__NR_getgroups, 0, list)) >= 0);
+ assert(list = calloc(size + 1, sizeof(*list)));
+ assert(syscall(__NR_getgroups, size, list) == size);
return 0;
#else
return 77;
# include "config.h"
#endif
#include <assert.h>
+#include <stdlib.h>
#include <unistd.h>
#include <sys/syscall.h>
&& defined(__NR_getresuid32) \
&& defined(__NR_setreuid32) \
&& defined(__NR_setresuid32) \
- && defined(__NR_chown32)
- uid_t r, e, s;
+ && defined(__NR_chown32) \
+ && defined(__NR_getgroups32)
+ int r, e, s;
+ int size;
+ int *list = 0;
e = syscall(__NR_getuid32);
assert(syscall(__NR_setuid32, e) == 0);
assert(syscall(__NR_setreuid32, -1, -1L) == 0);
assert(syscall(__NR_setresuid32, -1, e, -1L) == 0);
assert(syscall(__NR_chown32, ".", -1, -1L) == 0);
+ assert((size = syscall(__NR_getgroups32, 0, list)) >= 0);
+ assert(list = calloc(size + 1, sizeof(*list)));
+ assert(syscall(__NR_getgroups32, size, list) == size);
return 0;
#else
return 77;
# define SIZEIFY_(x,size) SIZEIFY__(x,size)
# define SIZEIFY__(x,size) x ## size
+# define printuid SIZEIFY(printuid)
+# define sys_chown SIZEIFY(sys_chown)
+# define sys_fchown SIZEIFY(sys_fchown)
+# define sys_getgroups SIZEIFY(sys_getgroups)
+# define sys_getresuid SIZEIFY(sys_getresuid)
# define sys_getuid SIZEIFY(sys_getuid)
# define sys_setfsuid SIZEIFY(sys_setfsuid)
-# define sys_setuid SIZEIFY(sys_setuid)
-# define sys_getresuid SIZEIFY(sys_getresuid)
-# define sys_setreuid SIZEIFY(sys_setreuid)
+# define sys_setgroups SIZEIFY(sys_setgroups)
# define sys_setresuid SIZEIFY(sys_setresuid)
-# define sys_chown SIZEIFY(sys_chown)
-# define sys_fchown SIZEIFY(sys_fchown)
-# define printuid SIZEIFY(printuid)
+# define sys_setreuid SIZEIFY(sys_setreuid)
+# define sys_setuid SIZEIFY(sys_setuid)
#endif /* STRACE_UID_SIZE */
#include "defs.h"
tprintf("%s%u", text, uid);
}
+int
+sys_setgroups(struct tcb *tcp)
+{
+ if (entering(tcp)) {
+ unsigned long len, size, start, cur, end, abbrev_end;
+ uid_t gid;
+ int failed = 0;
+
+ len = tcp->u_arg[0];
+ tprintf("%lu, ", len);
+ if (len == 0) {
+ tprints("[]");
+ return 0;
+ }
+ start = tcp->u_arg[1];
+ if (start == 0) {
+ tprints("NULL");
+ return 0;
+ }
+ size = len * sizeof(gid);
+ end = start + size;
+ if (!verbose(tcp) || size / sizeof(gid) != len || end < start) {
+ tprintf("%#lx", start);
+ return 0;
+ }
+ if (abbrev(tcp)) {
+ abbrev_end = start + max_strlen * sizeof(gid);
+ if (abbrev_end < start)
+ abbrev_end = end;
+ } else {
+ abbrev_end = end;
+ }
+ tprints("[");
+ for (cur = start; cur < end; cur += sizeof(gid)) {
+ if (cur > start)
+ tprints(", ");
+ if (cur >= abbrev_end) {
+ tprints("...");
+ break;
+ }
+ if (umoven(tcp, cur, sizeof(gid), (char *) &gid) < 0) {
+ tprints("?");
+ failed = 1;
+ break;
+ }
+ tprintf("%u", (unsigned int) gid);
+ }
+ tprints("]");
+ if (failed)
+ tprintf(" %#lx", tcp->u_arg[1]);
+ }
+ return 0;
+}
+
+int
+sys_getgroups(struct tcb *tcp)
+{
+ unsigned long len;
+
+ if (entering(tcp)) {
+ len = tcp->u_arg[0];
+ tprintf("%lu, ", len);
+ } else {
+ unsigned long size, start, cur, end, abbrev_end;
+ uid_t gid;
+ int failed = 0;
+
+ start = tcp->u_arg[1];
+ if (start == 0) {
+ tprints("NULL");
+ return 0;
+ }
+ len = tcp->u_rval;
+ if (len == 0) {
+ tprints("[]");
+ return 0;
+ }
+ size = len * sizeof(gid);
+ end = start + size;
+ if (!verbose(tcp) || tcp->u_arg[0] == 0 ||
+ size / sizeof(gid) != len || end < start) {
+ tprintf("%#lx", start);
+ return 0;
+ }
+ if (abbrev(tcp)) {
+ abbrev_end = start + max_strlen * sizeof(gid);
+ if (abbrev_end < start)
+ abbrev_end = end;
+ } else {
+ abbrev_end = end;
+ }
+ tprints("[");
+ for (cur = start; cur < end; cur += sizeof(gid)) {
+ if (cur > start)
+ tprints(", ");
+ if (cur >= abbrev_end) {
+ tprints("...");
+ break;
+ }
+ if (umoven(tcp, cur, sizeof(gid), (char *) &gid) < 0) {
+ tprints("?");
+ failed = 1;
+ break;
+ }
+ tprintf("%u", (unsigned int) gid);
+ }
+ tprints("]");
+ if (failed)
+ tprintf(" %#lx", tcp->u_arg[1]);
+ }
+ return 0;
+}
+
#endif /* STRACE_UID_SIZE */