Skip to content
This repository was archived by the owner on Jan 6, 2025. It is now read-only.

Commit ea97ecf

Browse files
committed
syscall logging example - handle non-returning syscalls
1 parent 63a99ca commit ea97ecf

File tree

3 files changed

+42
-40
lines changed

3 files changed

+42
-40
lines changed

examples/syscall_desc.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ static const struct syscall_desc table[] = {
5656
SARGS(brk, rdec, arg_),
5757
SARGS(rt_sigaction, rdec, arg_, arg_, arg_),
5858
SARGS(rt_sigprocmask, rdec, arg_, arg_, arg_, arg_),
59-
SARGS(rt_sigreturn, rdec, arg_none),
59+
SARGS(rt_sigreturn, rnoreturn, arg_none),
6060
SARGS(ioctl, rdec, arg_fd, arg_, arg_),
6161
SARGS(pread64, rdec, arg_fd, arg_, arg_, arg_),
6262
SARGS(pwrite64, rdec, arg_fd, arg_, arg_, arg_),
@@ -101,7 +101,7 @@ static const struct syscall_desc table[] = {
101101
SARGS(fork, rdec, arg_none),
102102
SARGS(vfork, rdec, arg_none),
103103
SARGS(execve, rdec, arg_, arg_, arg_),
104-
SARGS(exit, rdec, arg_), /* XXX */
104+
SARGS(exit, rnoreturn, arg_),
105105
SARGS(wait4, rdec, arg_, arg_, arg_, arg_),
106106
SARGS(kill, rdec, arg_, arg_),
107107
SARGS(uname, rdec, arg_),
@@ -255,7 +255,7 @@ static const struct syscall_desc table[] = {
255255
SARGS(clock_gettime, rdec, arg_, arg_),
256256
SARGS(clock_getres, rdec, arg_, arg_),
257257
SARGS(clock_nanosleep, rdec, arg_, arg_, arg_, arg_),
258-
SARGS(exit_group, rdec, arg_), /* XXX */
258+
SARGS(exit_group, rnoreturn, arg_),
259259
SARGS(epoll_wait, rdec, arg_fd, arg_, arg_, arg_),
260260
SARGS(epoll_ctl, rdec, arg_fd, arg_, arg_fd, arg_),
261261
SARGS(tgkill, rdec, arg_, arg_, arg_),

examples/syscall_desc.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,8 @@ enum return_type {
4747
rhex,
4848
rdec,
4949
runsigned,
50-
rmode
50+
rmode,
51+
rnoreturn
5152
};
5253

5354
struct syscall_desc {

examples/syscall_logger.c

Lines changed: 37 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -775,40 +775,44 @@ print_known_syscall(char *dst, const struct syscall_desc *desc,
775775
}
776776
}
777777

778-
dst = print_cstr(dst, ") = ");
779-
switch (desc->return_type) {
780-
case rhex:
781-
dst = print_hex(dst, result);
782-
break;
783-
case rdec:
784-
dst = print_rdec(dst, result);
785-
break;
786-
case runsigned:
787-
dst = print_runsigned(dst, result);
788-
break;
789-
case rmode:
790-
dst = print_mode_t(dst, result);
791-
break;
778+
*dst++ = ')';
779+
if (desc->return_type != rnoreturn) {
780+
dst = print_cstr(dst, " = ");
781+
switch (desc->return_type) {
782+
default:
783+
case rhex:
784+
dst = print_hex(dst, result);
785+
break;
786+
case rdec:
787+
dst = print_rdec(dst, result);
788+
break;
789+
case runsigned:
790+
dst = print_runsigned(dst, result);
791+
break;
792+
case rmode:
793+
dst = print_mode_t(dst, result);
794+
break;
795+
}
792796
}
793797

794798
return dst;
795799
}
796800

797-
static ssize_t
798-
print_syscall(char *dst, long syscall_number, long args[6], long result)
801+
static void
802+
print_syscall(const struct syscall_desc *desc,
803+
long syscall_number, const long args[6], long result)
799804
{
800-
const struct syscall_desc *desc =
801-
get_syscall_desc(syscall_number, args);
802-
805+
char local_buffer[0x300];
803806
char *c;
804807

805808
if (desc != NULL)
806-
c = print_known_syscall(dst, desc, args, result);
809+
c = print_known_syscall(local_buffer, desc, args, result);
807810
else
808-
c = print_unknown_syscall(dst, syscall_number, args, result);
811+
c = print_unknown_syscall(local_buffer, syscall_number,
812+
args, result);
809813

810814
*c++ = '\n';
811-
return c - dst;
815+
append_buffer(local_buffer, c - local_buffer);
812816
}
813817

814818
static int
@@ -818,17 +822,21 @@ hook(long syscall_number,
818822
long arg4, long arg5,
819823
long *result)
820824
{
821-
*result = syscall_no_intercept(syscall_number,
822-
arg0, arg1, arg2, arg3, arg4, arg5);
823-
824825
long args[6] = {arg0, arg1, arg2, arg3, arg4, arg5};
826+
const struct syscall_desc *desc =
827+
get_syscall_desc(syscall_number, args);
825828

826-
char local_buffer[0x300];
827-
ssize_t len;
829+
if (desc != NULL && desc->return_type == rnoreturn) {
830+
print_syscall(desc, syscall_number, args, 0);
831+
if (syscall_number == SYS_exit_group && buffer_offset > 0)
832+
syscall_no_intercept(SYS_write, log_fd,
833+
buffer, buffer_offset);
834+
}
828835

829-
len = print_syscall(local_buffer, syscall_number, args, *result);
836+
*result = syscall_no_intercept(syscall_number,
837+
arg0, arg1, arg2, arg3, arg4, arg5);
830838

831-
append_buffer(local_buffer, len);
839+
print_syscall(desc, syscall_number, args, *result);
832840

833841
return 0;
834842
}
@@ -848,10 +856,3 @@ start(void)
848856

849857
intercept_hook_point = &hook;
850858
}
851-
852-
static __attribute__((destructor)) void
853-
end(void)
854-
{
855-
if (buffer_offset > 0)
856-
syscall_no_intercept(SYS_write, log_fd, buffer, buffer_offset);
857-
}

0 commit comments

Comments
 (0)