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