@@ -63,6 +63,7 @@ int mptcp_subflow(struct bpf_sock_ops *skops)
63
63
static int _check_getsockopt_subflow_mark (struct mptcp_sock * msk , struct bpf_sockopt * ctx )
64
64
{
65
65
struct mptcp_subflow_context * subflow ;
66
+ int * optval = ctx -> optval ;
66
67
int i = 0 ;
67
68
68
69
mptcp_for_each_subflow (msk , subflow ) {
@@ -72,7 +73,10 @@ static int _check_getsockopt_subflow_mark(struct mptcp_sock *msk, struct bpf_soc
72
73
struct mptcp_subflow_context ));
73
74
74
75
if (ssk -> sk_mark != ++ i ) {
75
- ctx -> retval = -2 ;
76
+ if (ctx -> optval + sizeof (int ) <= ctx -> optval_end ) {
77
+ * optval = ssk -> sk_mark ;
78
+ ctx -> retval = 0 ;
79
+ }
76
80
break ;
77
81
}
78
82
}
@@ -83,6 +87,7 @@ static int _check_getsockopt_subflow_mark(struct mptcp_sock *msk, struct bpf_soc
83
87
static int _check_getsockopt_subflow_cc (struct mptcp_sock * msk , struct bpf_sockopt * ctx )
84
88
{
85
89
struct mptcp_subflow_context * subflow ;
90
+ char * optval = ctx -> optval ;
86
91
87
92
mptcp_for_each_subflow (msk , subflow ) {
88
93
struct inet_connection_sock * icsk ;
@@ -94,7 +99,10 @@ static int _check_getsockopt_subflow_cc(struct mptcp_sock *msk, struct bpf_socko
94
99
95
100
if (ssk -> sk_mark == 2 &&
96
101
__builtin_memcmp (icsk -> icsk_ca_ops -> name , cc , TCP_CA_NAME_MAX )) {
97
- ctx -> retval = -2 ;
102
+ if (ctx -> optval + TCP_CA_NAME_MAX <= ctx -> optval_end ) {
103
+ __builtin_memcpy (optval , icsk -> icsk_ca_ops -> name , TCP_CA_NAME_MAX );
104
+ ctx -> retval = 0 ;
105
+ }
98
106
break ;
99
107
}
100
108
}
0 commit comments