renameat2: add decoding support

* file.c (decode_renameat, sys_renameat2): New functions.
(sys_renameat): Use decode_renameat.
* pathtrace.c (pathtrace_match): Handle sys_renameat2.
* linux/syscall.h (sys_renameat2): New prototype.
* xlat/rename_flags.in: New file.
This commit is contained in:
Mike Frysinger 2014-08-14 04:05:41 -04:00 committed by Dmitry V. Levin
parent 67c4d437ba
commit 5b677ab904
4 changed files with 27 additions and 4 deletions

27
file.c
View File

@ -1767,15 +1767,34 @@ sys_readlinkat(struct tcb *tcp)
return decode_readlink(tcp, 1);
}
static void
decode_renameat(struct tcb *tcp)
{
print_dirfd(tcp, tcp->u_arg[0]);
printpath(tcp, tcp->u_arg[1]);
tprints(", ");
print_dirfd(tcp, tcp->u_arg[2]);
printpath(tcp, tcp->u_arg[3]);
}
int
sys_renameat(struct tcb *tcp)
{
if (entering(tcp)) {
print_dirfd(tcp, tcp->u_arg[0]);
printpath(tcp, tcp->u_arg[1]);
decode_renameat(tcp);
}
return 0;
}
#include "xlat/rename_flags.h"
int
sys_renameat2(struct tcb *tcp)
{
if (entering(tcp)) {
decode_renameat(tcp);
tprints(", ");
print_dirfd(tcp, tcp->u_arg[2]);
printpath(tcp, tcp->u_arg[3]);
printflags(rename_flags, tcp->u_arg[4], "RENAME_??");
}
return 0;
}

View File

@ -207,6 +207,7 @@ int sys_recvmsg();
int sys_remap_file_pages();
int sys_removexattr();
int sys_renameat();
int sys_renameat2();
int sys_request_key();
int sys_restart_syscall();
int sys_rt_sigaction();

View File

@ -211,6 +211,7 @@ pathtrace_match(struct tcb *tcp)
}
if (s->sys_func == sys_renameat ||
s->sys_func == sys_renameat2 ||
s->sys_func == sys_linkat)
{
/* fd, path, fd, path */

2
xlat/rename_flags.in Normal file
View File

@ -0,0 +1,2 @@
RENAME_NOREPLACE
RENAME_EXCHANGE