blob: 02cd699a8aca55420a36a6e3776d84e68c35d6d0 [file] [log] [blame]
Dmitry V. Levin80f7db12014-12-13 21:49:01 +00001#ifdef STRACE_UID_SIZE
2# if STRACE_UID_SIZE != 16
3# error invalid STRACE_UID_SIZE
4# endif
5
6# define SIZEIFY(x) SIZEIFY_(x,STRACE_UID_SIZE)
7# define SIZEIFY_(x,size) SIZEIFY__(x,size)
8# define SIZEIFY__(x,size) x ## size
9
Dmitry V. Levin530bed02014-12-14 13:30:54 +000010# define printuid SIZEIFY(printuid)
Dmitry V. Levin80f7db12014-12-13 21:49:01 +000011# define sys_chown SIZEIFY(sys_chown)
12# define sys_fchown SIZEIFY(sys_fchown)
Dmitry V. Levin530bed02014-12-14 13:30:54 +000013# define sys_getgroups SIZEIFY(sys_getgroups)
14# define sys_getresuid SIZEIFY(sys_getresuid)
15# define sys_getuid SIZEIFY(sys_getuid)
16# define sys_setfsuid SIZEIFY(sys_setfsuid)
17# define sys_setgroups SIZEIFY(sys_setgroups)
18# define sys_setresuid SIZEIFY(sys_setresuid)
19# define sys_setreuid SIZEIFY(sys_setreuid)
20# define sys_setuid SIZEIFY(sys_setuid)
Dmitry V. Levin80f7db12014-12-13 21:49:01 +000021#endif /* STRACE_UID_SIZE */
22
Dmitry V. Levine93ef1e2014-12-11 19:25:02 +000023#include "defs.h"
24
Dmitry V. Levin80f7db12014-12-13 21:49:01 +000025#ifdef STRACE_UID_SIZE
26# if !NEED_UID16_PARSERS
27# undef STRACE_UID_SIZE
28# endif
29#else
30# define STRACE_UID_SIZE 32
31#endif
32
33#ifdef STRACE_UID_SIZE
34
35# undef uid_t
36# define uid_t uid_t_(STRACE_UID_SIZE)
37# define uid_t_(size) uid_t__(size)
38# define uid_t__(size) uint ## size ## _t
Dmitry V. Levine93ef1e2014-12-11 19:25:02 +000039
Dmitry V. Levina0bd3742015-04-07 01:36:50 +000040SYS_FUNC(getuid)
Dmitry V. Levine93ef1e2014-12-11 19:25:02 +000041{
42 if (exiting(tcp))
43 tcp->u_rval = (uid_t) tcp->u_rval;
44 return RVAL_UDECIMAL;
45}
46
Dmitry V. Levina0bd3742015-04-07 01:36:50 +000047SYS_FUNC(setfsuid)
Dmitry V. Levine93ef1e2014-12-11 19:25:02 +000048{
49 if (entering(tcp))
50 tprintf("%u", (uid_t) tcp->u_arg[0]);
51 else
52 tcp->u_rval = (uid_t) tcp->u_rval;
53 return RVAL_UDECIMAL;
54}
55
Dmitry V. Levina0bd3742015-04-07 01:36:50 +000056SYS_FUNC(setuid)
Dmitry V. Levine93ef1e2014-12-11 19:25:02 +000057{
58 if (entering(tcp)) {
59 tprintf("%u", (uid_t) tcp->u_arg[0]);
60 }
61 return 0;
62}
63
Dmitry V. Levin80f7db12014-12-13 21:49:01 +000064static void
65get_print_uid(struct tcb *tcp, const char *prefix, const long addr)
66{
67 uid_t uid;
68
69 if (umove(tcp, addr, &uid) < 0)
70 tprintf("%s%#lx", prefix, addr);
71 else
72 tprintf("%s[%u]", prefix, uid);
73}
74
Dmitry V. Levina0bd3742015-04-07 01:36:50 +000075SYS_FUNC(getresuid)
Dmitry V. Levine93ef1e2014-12-11 19:25:02 +000076{
77 if (exiting(tcp)) {
Dmitry V. Levin80f7db12014-12-13 21:49:01 +000078 if (syserror(tcp)) {
Dmitry V. Levine93ef1e2014-12-11 19:25:02 +000079 tprintf("%#lx, %#lx, %#lx", tcp->u_arg[0],
80 tcp->u_arg[1], tcp->u_arg[2]);
Dmitry V. Levin80f7db12014-12-13 21:49:01 +000081 } else {
82 get_print_uid(tcp, "", tcp->u_arg[0]);
83 get_print_uid(tcp, ", ", tcp->u_arg[1]);
84 get_print_uid(tcp, ", ", tcp->u_arg[2]);
Dmitry V. Levine93ef1e2014-12-11 19:25:02 +000085 }
86 }
87 return 0;
88}
89
Dmitry V. Levina0bd3742015-04-07 01:36:50 +000090SYS_FUNC(setreuid)
Dmitry V. Levine93ef1e2014-12-11 19:25:02 +000091{
92 if (entering(tcp)) {
93 printuid("", tcp->u_arg[0]);
94 printuid(", ", tcp->u_arg[1]);
95 }
96 return 0;
97}
98
Dmitry V. Levina0bd3742015-04-07 01:36:50 +000099SYS_FUNC(setresuid)
Dmitry V. Levine93ef1e2014-12-11 19:25:02 +0000100{
101 if (entering(tcp)) {
102 printuid("", tcp->u_arg[0]);
103 printuid(", ", tcp->u_arg[1]);
104 printuid(", ", tcp->u_arg[2]);
105 }
106 return 0;
107}
Dmitry V. Levin25ebe462014-12-13 16:02:22 +0000108
Dmitry V. Levina0bd3742015-04-07 01:36:50 +0000109SYS_FUNC(chown)
Dmitry V. Levin2f7d0202014-12-13 16:20:44 +0000110{
111 if (entering(tcp)) {
112 printpath(tcp, tcp->u_arg[0]);
113 printuid(", ", tcp->u_arg[1]);
114 printuid(", ", tcp->u_arg[2]);
115 }
116 return 0;
117}
118
Dmitry V. Levina0bd3742015-04-07 01:36:50 +0000119SYS_FUNC(fchown)
Dmitry V. Levin2f7d0202014-12-13 16:20:44 +0000120{
121 if (entering(tcp)) {
122 printfd(tcp, tcp->u_arg[0]);
123 printuid(", ", tcp->u_arg[1]);
124 printuid(", ", tcp->u_arg[2]);
125 }
126 return 0;
127}
128
Dmitry V. Levin25ebe462014-12-13 16:02:22 +0000129void
130printuid(const char *text, const unsigned int uid)
131{
Dmitry V. Levin80f7db12014-12-13 21:49:01 +0000132 if ((unsigned int) -1 == uid || (uid_t) -1 == uid)
Dmitry V. Levin25ebe462014-12-13 16:02:22 +0000133 tprintf("%s-1", text);
134 else
135 tprintf("%s%u", text, uid);
136}
Dmitry V. Levin80f7db12014-12-13 21:49:01 +0000137
Dmitry V. Levina0bd3742015-04-07 01:36:50 +0000138SYS_FUNC(setgroups)
Dmitry V. Levin530bed02014-12-14 13:30:54 +0000139{
140 if (entering(tcp)) {
141 unsigned long len, size, start, cur, end, abbrev_end;
142 uid_t gid;
143 int failed = 0;
144
145 len = tcp->u_arg[0];
146 tprintf("%lu, ", len);
147 if (len == 0) {
148 tprints("[]");
149 return 0;
150 }
151 start = tcp->u_arg[1];
152 if (start == 0) {
153 tprints("NULL");
154 return 0;
155 }
156 size = len * sizeof(gid);
157 end = start + size;
158 if (!verbose(tcp) || size / sizeof(gid) != len || end < start) {
159 tprintf("%#lx", start);
160 return 0;
161 }
162 if (abbrev(tcp)) {
163 abbrev_end = start + max_strlen * sizeof(gid);
164 if (abbrev_end < start)
165 abbrev_end = end;
166 } else {
167 abbrev_end = end;
168 }
169 tprints("[");
170 for (cur = start; cur < end; cur += sizeof(gid)) {
171 if (cur > start)
172 tprints(", ");
173 if (cur >= abbrev_end) {
174 tprints("...");
175 break;
176 }
Denys Vlasenko7e69ed92015-03-21 19:50:53 +0100177 if (umoven(tcp, cur, sizeof(gid), &gid) < 0) {
Dmitry V. Levin530bed02014-12-14 13:30:54 +0000178 tprints("?");
179 failed = 1;
180 break;
181 }
182 tprintf("%u", (unsigned int) gid);
183 }
184 tprints("]");
185 if (failed)
186 tprintf(" %#lx", tcp->u_arg[1]);
187 }
188 return 0;
189}
190
Dmitry V. Levina0bd3742015-04-07 01:36:50 +0000191SYS_FUNC(getgroups)
Dmitry V. Levin530bed02014-12-14 13:30:54 +0000192{
193 unsigned long len;
194
195 if (entering(tcp)) {
196 len = tcp->u_arg[0];
197 tprintf("%lu, ", len);
198 } else {
199 unsigned long size, start, cur, end, abbrev_end;
200 uid_t gid;
201 int failed = 0;
202
203 start = tcp->u_arg[1];
204 if (start == 0) {
205 tprints("NULL");
206 return 0;
207 }
208 len = tcp->u_rval;
209 if (len == 0) {
210 tprints("[]");
211 return 0;
212 }
213 size = len * sizeof(gid);
214 end = start + size;
215 if (!verbose(tcp) || tcp->u_arg[0] == 0 ||
216 size / sizeof(gid) != len || end < start) {
217 tprintf("%#lx", start);
218 return 0;
219 }
220 if (abbrev(tcp)) {
221 abbrev_end = start + max_strlen * sizeof(gid);
222 if (abbrev_end < start)
223 abbrev_end = end;
224 } else {
225 abbrev_end = end;
226 }
227 tprints("[");
228 for (cur = start; cur < end; cur += sizeof(gid)) {
229 if (cur > start)
230 tprints(", ");
231 if (cur >= abbrev_end) {
232 tprints("...");
233 break;
234 }
Denys Vlasenko7e69ed92015-03-21 19:50:53 +0100235 if (umoven(tcp, cur, sizeof(gid), &gid) < 0) {
Dmitry V. Levin530bed02014-12-14 13:30:54 +0000236 tprints("?");
237 failed = 1;
238 break;
239 }
240 tprintf("%u", (unsigned int) gid);
241 }
242 tprints("]");
243 if (failed)
244 tprintf(" %#lx", tcp->u_arg[1]);
245 }
246 return 0;
247}
248
Dmitry V. Levin80f7db12014-12-13 21:49:01 +0000249#endif /* STRACE_UID_SIZE */