diff options
| -rw-r--r-- | init/Kconfig | 1 | ||||
| -rw-r--r-- | net/sched/cls_flow.c | 16 |
2 files changed, 12 insertions, 5 deletions
diff --git a/init/Kconfig b/init/Kconfig index 2660b312ae9d..b44c3a390699 100644 --- a/init/Kconfig +++ b/init/Kconfig | |||
| @@ -943,7 +943,6 @@ config UIDGID_CONVERTED | |||
| 943 | 943 | ||
| 944 | # Networking | 944 | # Networking |
| 945 | depends on NET_9P = n | 945 | depends on NET_9P = n |
| 946 | depends on NET_CLS_FLOW = n | ||
| 947 | depends on NETFILTER_XT_MATCH_OWNER = n | 946 | depends on NETFILTER_XT_MATCH_OWNER = n |
| 948 | depends on NETFILTER_XT_MATCH_RECENT = n | 947 | depends on NETFILTER_XT_MATCH_RECENT = n |
| 949 | depends on NETFILTER_XT_TARGET_LOG = n | 948 | depends on NETFILTER_XT_TARGET_LOG = n |
diff --git a/net/sched/cls_flow.c b/net/sched/cls_flow.c index ae854f3434b0..ce82d0cb1b47 100644 --- a/net/sched/cls_flow.c +++ b/net/sched/cls_flow.c | |||
| @@ -193,15 +193,19 @@ static u32 flow_get_rtclassid(const struct sk_buff *skb) | |||
| 193 | 193 | ||
| 194 | static u32 flow_get_skuid(const struct sk_buff *skb) | 194 | static u32 flow_get_skuid(const struct sk_buff *skb) |
| 195 | { | 195 | { |
| 196 | if (skb->sk && skb->sk->sk_socket && skb->sk->sk_socket->file) | 196 | if (skb->sk && skb->sk->sk_socket && skb->sk->sk_socket->file) { |
| 197 | return skb->sk->sk_socket->file->f_cred->fsuid; | 197 | kuid_t skuid = skb->sk->sk_socket->file->f_cred->fsuid; |
| 198 | return from_kuid(&init_user_ns, skuid); | ||
| 199 | } | ||
| 198 | return 0; | 200 | return 0; |
| 199 | } | 201 | } |
| 200 | 202 | ||
| 201 | static u32 flow_get_skgid(const struct sk_buff *skb) | 203 | static u32 flow_get_skgid(const struct sk_buff *skb) |
| 202 | { | 204 | { |
| 203 | if (skb->sk && skb->sk->sk_socket && skb->sk->sk_socket->file) | 205 | if (skb->sk && skb->sk->sk_socket && skb->sk->sk_socket->file) { |
| 204 | return skb->sk->sk_socket->file->f_cred->fsgid; | 206 | kgid_t skgid = skb->sk->sk_socket->file->f_cred->fsgid; |
| 207 | return from_kgid(&init_user_ns, skgid); | ||
| 208 | } | ||
| 205 | return 0; | 209 | return 0; |
| 206 | } | 210 | } |
| 207 | 211 | ||
| @@ -387,6 +391,10 @@ static int flow_change(struct sk_buff *in_skb, | |||
| 387 | 391 | ||
| 388 | if (fls(keymask) - 1 > FLOW_KEY_MAX) | 392 | if (fls(keymask) - 1 > FLOW_KEY_MAX) |
| 389 | return -EOPNOTSUPP; | 393 | return -EOPNOTSUPP; |
| 394 | |||
| 395 | if ((keymask & (FLOW_KEY_SKUID|FLOW_KEY_SKGID)) && | ||
| 396 | sk_user_ns(NETLINK_CB(in_skb).ssk) != &init_user_ns) | ||
| 397 | return -EOPNOTSUPP; | ||
| 390 | } | 398 | } |
| 391 | 399 | ||
| 392 | err = tcf_exts_validate(tp, tb, tca[TCA_RATE], &e, &flow_ext_map); | 400 | err = tcf_exts_validate(tp, tb, tca[TCA_RATE], &e, &flow_ext_map); |
