File: socketcall.c

package info (click to toggle)
trinity 1.9%2Bgit20200331.4d2343bd18c7b-2%2Bdeb11u1
  • links: PTS, VCS
  • area: main
  • in suites: bullseye
  • size: 3,080 kB
  • sloc: ansic: 32,746; sh: 536; makefile: 164
file content (81 lines) | stat: -rw-r--r-- 2,442 bytes parent folder | download | duplicates (5)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
/*
 * SYSCALL_DEFINE2(socketcall, int, call, unsigned long __user *, args)
 */
#include <stdlib.h>
#include <linux/net.h>
#include <sys/types.h>
#include <sys/socket.h>
#include "net.h"
#include "sanitise.h"
#include "shm.h"
#include "syscall.h"
#include "trinity.h"
#include "utils.h"
#include "compat.h"

static void socketcall_socket(unsigned long *args)
{
	struct socket_triplet st = { .family = 0, .protocol = 0, .type = 0 };

	gen_socket_args(&st);

	args[0] = st.family;
	args[1] = st.type;
	args[2] = st.protocol;
}

struct socketcall_ptr {
        unsigned int call;
        void (*func)(unsigned long *args);
};

static const struct socketcall_ptr socketcallptrs[] = {
	{ .call = SYS_SOCKET, .func = socketcall_socket },
//	{ .call = SYS_BIND, .func = socketcall_bind },
//	{ .call = SYS_CONNECT, .func = socketcall_connect },
//	{ .call = SYS_LISTEN, .func = socketcall_listen },
//	{ .call = SYS_ACCEPT, .func = socketcall_accept },
//	{ .call = SYS_GETSOCKNAME, .func = socketcall_getsockname },
//	{ .call = SYS_GETPEERNAME, .func = socketcall_getpeername },
//	{ .call = SYS_SOCKETPAIR, .func = socketcall_socketpair },
//	{ .call = SYS_SEND, .func = socketcall_send },
//	{ .call = SYS_RECV, .func = socketcall_recv },
//	{ .call = SYS_SENDTO, .func = socketcall_sendto },
//	{ .call = SYS_RECVFROM, .func = socketcall_recvfrom },
//	{ .call = SYS_SHUTDOWN, .func = socketcall_shutdown },
//	{ .call = SYS_SETSOCKOPT, .func = socketcall_setsockopt },
//	{ .call = SYS_GETSOCKOPT, .func = socketcall_getsockopt },
//	{ .call = SYS_SENDMSG, .func = socketcall_sendmsg },
//	{ .call = SYS_RECVMSG, .func = socketcall_recvmsg },
//	{ .call = SYS_ACCEPT4, .func = socketcall_accept },
//	{ .call = SYS_RECVMMSG, .func = socketcall_recvmmsg },
//	{ .call = SYS_SENDMMSG, .func = socketcall_sendmmsg },
};


static void sanitise_socketcall(struct syscallrecord *rec)
{
	unsigned long *args;
	unsigned int i;

	args = zmalloc(6 * sizeof(unsigned long));

	//rec->a1 = rnd() % ARRAY_SIZE(socketcallptrs);
	rec->a1 = SYS_SOCKET;	//FIXME: Add other options and remove this hardcode.

	for (i = 0; i < ARRAY_SIZE(socketcallptrs); i++) {
		if (socketcallptrs[i].call == rec->a1)
			socketcallptrs[i].func(args);
	}

	rec->a2 = (unsigned long) args;
}

struct syscallentry syscall_socketcall = {
	.name = "socketcall",
	.num_args = 2,
	.arg1name = "call",
	.arg2name = "args",
	.arg2type = ARG_ADDRESS,
	.sanitise = sanitise_socketcall,
};