]> granicus.if.org Git - strace/blob - xattr.c
print_xattr_list: remove redundant address check
[strace] / xattr.c
1 #include "defs.h"
2
3 #ifdef HAVE_SYS_XATTR_H
4 # include <sys/xattr.h>
5 #endif
6
7 #include "xlat/xattrflags.h"
8
9 static void
10 print_xattr_val(struct tcb *tcp, int failed,
11                 unsigned long arg,
12                 unsigned long insize,
13                 unsigned long size)
14 {
15         char *buf;
16         unsigned int len;
17
18         if (insize == 0)
19                 goto failed;
20
21         len = size;
22         if (size != (unsigned long) len)
23                 goto failed;
24
25         if (!len) {
26                 tprintf(", \"\", %ld", insize);
27                 return;
28         }
29
30         buf = malloc(len);
31         if (!buf)
32                 goto failed;
33
34         if (umoven(tcp, arg, len, buf) < 0) {
35                 free(buf);
36                 goto failed;
37         }
38
39         /* Don't print terminating NUL if there is one. */
40         if (buf[len - 1] == '\0')
41                 --len;
42
43         tprints(", ");
44         print_quoted_string(buf, len, 0);
45         tprintf(", %ld", insize);
46
47         free(buf);
48         return;
49
50 failed:
51         tprintf(", 0x%lx, %ld", arg, insize);
52 }
53
54 SYS_FUNC(setxattr)
55 {
56         if (entering(tcp)) {
57                 printpath(tcp, tcp->u_arg[0]);
58                 tprints(", ");
59                 printstr(tcp, tcp->u_arg[1], -1);
60                 print_xattr_val(tcp, 0, tcp->u_arg[2], tcp->u_arg[3], tcp->u_arg[3]);
61                 tprints(", ");
62                 printflags(xattrflags, tcp->u_arg[4], "XATTR_???");
63         }
64         return 0;
65 }
66
67 SYS_FUNC(fsetxattr)
68 {
69         if (entering(tcp)) {
70                 printfd(tcp, tcp->u_arg[0]);
71                 tprints(", ");
72                 printstr(tcp, tcp->u_arg[1], -1);
73                 print_xattr_val(tcp, 0, tcp->u_arg[2], tcp->u_arg[3], tcp->u_arg[3]);
74                 tprints(", ");
75                 printflags(xattrflags, tcp->u_arg[4], "XATTR_???");
76         }
77         return 0;
78 }
79
80 SYS_FUNC(getxattr)
81 {
82         if (entering(tcp)) {
83                 printpath(tcp, tcp->u_arg[0]);
84                 tprints(", ");
85                 printstr(tcp, tcp->u_arg[1], -1);
86         } else {
87                 print_xattr_val(tcp, syserror(tcp), tcp->u_arg[2], tcp->u_arg[3],
88                                 tcp->u_rval);
89         }
90         return 0;
91 }
92
93 SYS_FUNC(fgetxattr)
94 {
95         if (entering(tcp)) {
96                 printfd(tcp, tcp->u_arg[0]);
97                 tprints(", ");
98                 printstr(tcp, tcp->u_arg[1], -1);
99         } else {
100                 print_xattr_val(tcp, syserror(tcp), tcp->u_arg[2], tcp->u_arg[3],
101                                 tcp->u_rval);
102         }
103         return 0;
104 }
105
106 static void
107 print_xattr_list(struct tcb *tcp, unsigned long addr, unsigned long size)
108 {
109         if (syserror(tcp)) {
110                 tprintf("%#lx", addr);
111         } else {
112                 unsigned long len =
113                         (size < (unsigned long) tcp->u_rval) ?
114                                 size : (unsigned long) tcp->u_rval;
115                 printstr(tcp, addr, len);
116         }
117         tprintf(", %lu", size);
118 }
119
120 SYS_FUNC(listxattr)
121 {
122         if (entering(tcp)) {
123                 printpath(tcp, tcp->u_arg[0]);
124                 tprints(", ");
125         } else {
126                 print_xattr_list(tcp, tcp->u_arg[1], tcp->u_arg[2]);
127         }
128         return 0;
129 }
130
131 SYS_FUNC(flistxattr)
132 {
133         if (entering(tcp)) {
134                 printfd(tcp, tcp->u_arg[0]);
135                 tprints(", ");
136         } else {
137                 print_xattr_list(tcp, tcp->u_arg[1], tcp->u_arg[2]);
138         }
139         return 0;
140 }
141
142 SYS_FUNC(removexattr)
143 {
144         if (entering(tcp)) {
145                 printpath(tcp, tcp->u_arg[0]);
146                 tprints(", ");
147                 printstr(tcp, tcp->u_arg[1], -1);
148         }
149         return 0;
150 }
151
152 SYS_FUNC(fremovexattr)
153 {
154         if (entering(tcp)) {
155                 printfd(tcp, tcp->u_arg[0]);
156                 tprints(", ");
157                 printstr(tcp, tcp->u_arg[1], -1);
158         }
159         return 0;
160 }