From a228405a08f583e34c0e11e4247b2400c6e4168c Mon Sep 17 00:00:00 2001 From: Eugene Syromyatnikov Date: Wed, 9 May 2018 12:44:28 +0000 Subject: [PATCH] net: print SO_GET_FILTER in getsockopt SO_ATTACH_FILTER and SO_GET_FILTER have the same value; the former constant is intended for use in setsockopt, and the latter is for getsockopt. Handle that the same way as similar SOL_IP/SOL_IPV6 socket options are handled. * xlat/getsock_options.in: New file. * xlat/setsock_options.in: Likewise. * xlat/sockoptions.in (SO_ATTACH_FILTER): Move to xlat/setsock_options.in. * net.c: Include "xlat/setsock_options.h" and "xlat/getsock_options.h". (print_sockopt_fd_level_name) : Use getsock_options or setsock_options as auxiliary xlats based on the value of is_getsockopt flag. * tests/sock_filter-v.c: Update expected output. Co-Authored-by: Dmitry V. Levin --- net.c | 6 +++++- tests/sock_filter-v.c | 21 +++++++++++++-------- xlat/getsock_options.in | 5 +++++ xlat/setsock_options.in | 5 +++++ xlat/sock_options.in | 6 ------ 5 files changed, 28 insertions(+), 15 deletions(-) create mode 100644 xlat/getsock_options.in create mode 100644 xlat/setsock_options.in diff --git a/net.c b/net.c index 72b2b0ca..4108314d 100644 --- a/net.c +++ b/net.c @@ -426,6 +426,8 @@ SYS_FUNC(socketpair) } #include "xlat/sock_options.h" +#include "xlat/getsock_options.h" +#include "xlat/setsock_options.h" #include "xlat/sock_ip_options.h" #include "xlat/getsock_ip_options.h" #include "xlat/setsock_ip_options.h" @@ -466,7 +468,9 @@ print_sockopt_fd_level_name(struct tcb *tcp, int fd, unsigned int level, switch (level) { case SOL_SOCKET: - printxval(sock_options, name, "SO_???"); + printxvals(name, "SO_???", sock_options, + is_getsockopt ? getsock_options : + setsock_options, NULL); break; case SOL_IP: printxvals(name, "IP_???", sock_ip_options, diff --git a/tests/sock_filter-v.c b/tests/sock_filter-v.c index 4fbb5b9e..bae369e2 100644 --- a/tests/sock_filter-v.c +++ b/tests/sock_filter-v.c @@ -35,6 +35,11 @@ #include #include +/* SO_GET_FILTER was introduced by Linux commit v3.8-rc1~139^2~518 */ +#ifndef SO_GET_FILTER +# define SO_GET_FILTER SO_ATTACH_FILTER +#endif + #define HEX_FMT "%#x" #if XLAT_RAW @@ -116,7 +121,7 @@ static const char *errstr; static int get_filter(int fd, void *val, socklen_t *len) { - int rc = getsockopt(fd, SOL_SOCKET, SO_ATTACH_FILTER, val, len); + int rc = getsockopt(fd, SOL_SOCKET, SO_GET_FILTER, val, len); errstr = sprintrc(rc); return rc; } @@ -150,17 +155,17 @@ main(void) *len = BPF_MAXINSNS; rc = get_filter(fd, NULL, len); if (rc) - perror_msg_and_skip("getsockopt SOL_SOCKET SO_ATTACH_FILTER"); + perror_msg_and_skip("getsockopt SOL_SOCKET SO_GET_FILTER"); printf("getsockopt(%d, " XLAT_FMT ", " XLAT_FMT ", NULL, [%u->0]) " "= 0\n", - fd, XLAT_ARGS(SOL_SOCKET), XLAT_ARGS(SO_ATTACH_FILTER), + fd, XLAT_ARGS(SOL_SOCKET), XLAT_ARGS(SO_GET_FILTER), BPF_MAXINSNS); /* getsockopt NULL optlen - EFAULT */ rc = get_filter(fd, NULL, NULL); printf("getsockopt(%d, " XLAT_FMT ", " XLAT_FMT ", NULL, NULL) " "= %s\n", - fd, XLAT_ARGS(SOL_SOCKET), XLAT_ARGS(SO_ATTACH_FILTER), errstr); + fd, XLAT_ARGS(SOL_SOCKET), XLAT_ARGS(SO_GET_FILTER), errstr); /* attach a filter */ rc = set_filter(fd, prog, sizeof(*prog)); @@ -194,28 +199,28 @@ main(void) rc = get_filter(fd, efault, len); printf("getsockopt(%d, " XLAT_FMT ", " XLAT_FMT ", %p, [0->%u]) " "= %s\n", - fd, XLAT_ARGS(SOL_SOCKET), XLAT_ARGS(SO_ATTACH_FILTER), efault, + fd, XLAT_ARGS(SOL_SOCKET), XLAT_ARGS(SO_GET_FILTER), efault, (unsigned int) ARRAY_SIZE(bpf_filter), errstr); /* getsockopt optlen is too small - EINVAL */ *len = ARRAY_SIZE(bpf_filter) - 1; rc = get_filter(fd, efault, len); printf("getsockopt(%d, " XLAT_FMT ", " XLAT_FMT ", %p, [%u]) = %s\n", - fd, XLAT_ARGS(SOL_SOCKET), XLAT_ARGS(SO_ATTACH_FILTER), efault, + fd, XLAT_ARGS(SOL_SOCKET), XLAT_ARGS(SO_GET_FILTER), efault, (unsigned int) ARRAY_SIZE(bpf_filter) - 1, errstr); /* getsockopt optval EFAULT */ *len = ARRAY_SIZE(bpf_filter); rc = get_filter(fd, filter + 1, len); printf("getsockopt(%d, " XLAT_FMT ", " XLAT_FMT ", %p, [%u]) = %s\n", - fd, XLAT_ARGS(SOL_SOCKET), XLAT_ARGS(SO_ATTACH_FILTER), + fd, XLAT_ARGS(SOL_SOCKET), XLAT_ARGS(SO_GET_FILTER), filter + 1, (unsigned int) ARRAY_SIZE(bpf_filter), errstr); /* getsockopt optlen is too large - truncated */ *len = ARRAY_SIZE(bpf_filter) + 1; rc = get_filter(fd, filter, len); printf("getsockopt(%d, " XLAT_FMT ", " XLAT_FMT ", ", - fd, XLAT_ARGS(SOL_SOCKET), XLAT_ARGS(SO_ATTACH_FILTER)); + fd, XLAT_ARGS(SOL_SOCKET), XLAT_ARGS(SO_GET_FILTER)); print_filter(); printf(", [%u->%d]) = %s\n", (unsigned int) ARRAY_SIZE(bpf_filter) + 1, *len, errstr); diff --git a/xlat/getsock_options.in b/xlat/getsock_options.in new file mode 100644 index 00000000..6e476239 --- /dev/null +++ b/xlat/getsock_options.in @@ -0,0 +1,5 @@ +#if defined __hppa__ +SO_GET_FILTER 16410 +#else +SO_GET_FILTER 26 +#endif diff --git a/xlat/setsock_options.in b/xlat/setsock_options.in new file mode 100644 index 00000000..38f29207 --- /dev/null +++ b/xlat/setsock_options.in @@ -0,0 +1,5 @@ +#if defined __hppa__ +SO_ATTACH_FILTER 16410 +#else +SO_ATTACH_FILTER 26 +#endif diff --git a/xlat/sock_options.in b/xlat/sock_options.in index be6da986..6104f4a0 100644 --- a/xlat/sock_options.in +++ b/xlat/sock_options.in @@ -196,12 +196,6 @@ SO_BINDTODEVICE 16409 SO_BINDTODEVICE 25 #endif -#if defined __hppa__ -SO_ATTACH_FILTER 16410 -#else -SO_ATTACH_FILTER 26 -#endif - #if defined __hppa__ SO_DETACH_FILTER 16411 #else -- 2.40.0