diff options
| -rw-r--r-- | net/sunrpc/auth_gss/svcauth_gss.c | 12 | ||||
| -rw-r--r-- | net/sunrpc/xprtsock.c | 15 |
2 files changed, 18 insertions, 9 deletions
diff --git a/net/sunrpc/auth_gss/svcauth_gss.c b/net/sunrpc/auth_gss/svcauth_gss.c index f7d34e7b6f81..5ead60550895 100644 --- a/net/sunrpc/auth_gss/svcauth_gss.c +++ b/net/sunrpc/auth_gss/svcauth_gss.c | |||
| @@ -447,17 +447,21 @@ static int rsc_parse(struct cache_detail *cd, | |||
| 447 | else { | 447 | else { |
| 448 | int N, i; | 448 | int N, i; |
| 449 | 449 | ||
| 450 | /* | ||
| 451 | * NOTE: we skip uid_valid()/gid_valid() checks here: | ||
| 452 | * instead, * -1 id's are later mapped to the | ||
| 453 | * (export-specific) anonymous id by nfsd_setuser. | ||
| 454 | * | ||
| 455 | * (But supplementary gid's get no such special | ||
| 456 | * treatment so are checked for validity here.) | ||
| 457 | */ | ||
| 450 | /* uid */ | 458 | /* uid */ |
| 451 | rsci.cred.cr_uid = make_kuid(&init_user_ns, id); | 459 | rsci.cred.cr_uid = make_kuid(&init_user_ns, id); |
| 452 | if (!uid_valid(rsci.cred.cr_uid)) | ||
| 453 | goto out; | ||
| 454 | 460 | ||
| 455 | /* gid */ | 461 | /* gid */ |
| 456 | if (get_int(&mesg, &id)) | 462 | if (get_int(&mesg, &id)) |
| 457 | goto out; | 463 | goto out; |
| 458 | rsci.cred.cr_gid = make_kgid(&init_user_ns, id); | 464 | rsci.cred.cr_gid = make_kgid(&init_user_ns, id); |
| 459 | if (!gid_valid(rsci.cred.cr_gid)) | ||
| 460 | goto out; | ||
| 461 | 465 | ||
| 462 | /* number of additional gid's */ | 466 | /* number of additional gid's */ |
| 463 | if (get_int(&mesg, &N)) | 467 | if (get_int(&mesg, &N)) |
diff --git a/net/sunrpc/xprtsock.c b/net/sunrpc/xprtsock.c index c1d8476b7692..3d02130828da 100644 --- a/net/sunrpc/xprtsock.c +++ b/net/sunrpc/xprtsock.c | |||
| @@ -849,6 +849,14 @@ static void xs_tcp_close(struct rpc_xprt *xprt) | |||
| 849 | xs_tcp_shutdown(xprt); | 849 | xs_tcp_shutdown(xprt); |
| 850 | } | 850 | } |
| 851 | 851 | ||
| 852 | static void xs_local_destroy(struct rpc_xprt *xprt) | ||
| 853 | { | ||
| 854 | xs_close(xprt); | ||
| 855 | xs_free_peer_addresses(xprt); | ||
| 856 | xprt_free(xprt); | ||
| 857 | module_put(THIS_MODULE); | ||
| 858 | } | ||
| 859 | |||
| 852 | /** | 860 | /** |
| 853 | * xs_destroy - prepare to shutdown a transport | 861 | * xs_destroy - prepare to shutdown a transport |
| 854 | * @xprt: doomed transport | 862 | * @xprt: doomed transport |
| @@ -862,10 +870,7 @@ static void xs_destroy(struct rpc_xprt *xprt) | |||
| 862 | 870 | ||
| 863 | cancel_delayed_work_sync(&transport->connect_worker); | 871 | cancel_delayed_work_sync(&transport->connect_worker); |
| 864 | 872 | ||
| 865 | xs_close(xprt); | 873 | xs_local_destroy(xprt); |
| 866 | xs_free_peer_addresses(xprt); | ||
| 867 | xprt_free(xprt); | ||
| 868 | module_put(THIS_MODULE); | ||
| 869 | } | 874 | } |
| 870 | 875 | ||
| 871 | static inline struct rpc_xprt *xprt_from_sock(struct sock *sk) | 876 | static inline struct rpc_xprt *xprt_from_sock(struct sock *sk) |
| @@ -2482,7 +2487,7 @@ static struct rpc_xprt_ops xs_local_ops = { | |||
| 2482 | .send_request = xs_local_send_request, | 2487 | .send_request = xs_local_send_request, |
| 2483 | .set_retrans_timeout = xprt_set_retrans_timeout_def, | 2488 | .set_retrans_timeout = xprt_set_retrans_timeout_def, |
| 2484 | .close = xs_close, | 2489 | .close = xs_close, |
| 2485 | .destroy = xs_destroy, | 2490 | .destroy = xs_local_destroy, |
| 2486 | .print_stats = xs_local_print_stats, | 2491 | .print_stats = xs_local_print_stats, |
| 2487 | }; | 2492 | }; |
| 2488 | 2493 | ||
