diff options
| author | Kinglong Mee <kinglongmee@gmail.com> | 2014-03-23 23:07:22 -0400 |
|---|---|---|
| committer | J. Bruce Fields <bfields@redhat.com> | 2014-03-28 21:23:39 -0400 |
| commit | 315f3812dbd92c7c8f26a8dbba183266ec219795 (patch) | |
| tree | 883153bcf809468e042f1df53e09511e930cee9d /net | |
| parent | 3cbe01a94c7b369f943f8a9d40394198d757cdd4 (diff) | |
SUNRPC: fix memory leak of peer addresses in XPRT
Creating xprt failed after xs_format_peer_addresses,
sunrpc must free those memory of peer addresses in xprt.
Signed-off-by: Kinglong Mee <kinglongmee@gmail.com>
Signed-off-by: J. Bruce Fields <bfields@redhat.com>
Diffstat (limited to 'net')
| -rw-r--r-- | net/sunrpc/xprtsock.c | 19 |
1 files changed, 11 insertions, 8 deletions
diff --git a/net/sunrpc/xprtsock.c b/net/sunrpc/xprtsock.c index 817a1e523969..4b921a926994 100644 --- a/net/sunrpc/xprtsock.c +++ b/net/sunrpc/xprtsock.c | |||
| @@ -905,6 +905,12 @@ static void xs_tcp_close(struct rpc_xprt *xprt) | |||
| 905 | xs_tcp_shutdown(xprt); | 905 | xs_tcp_shutdown(xprt); |
| 906 | } | 906 | } |
| 907 | 907 | ||
| 908 | static void xs_xprt_free(struct rpc_xprt *xprt) | ||
| 909 | { | ||
| 910 | xs_free_peer_addresses(xprt); | ||
| 911 | xprt_free(xprt); | ||
| 912 | } | ||
| 913 | |||
| 908 | /** | 914 | /** |
| 909 | * xs_destroy - prepare to shutdown a transport | 915 | * xs_destroy - prepare to shutdown a transport |
| 910 | * @xprt: doomed transport | 916 | * @xprt: doomed transport |
| @@ -915,8 +921,7 @@ static void xs_destroy(struct rpc_xprt *xprt) | |||
| 915 | dprintk("RPC: xs_destroy xprt %p\n", xprt); | 921 | dprintk("RPC: xs_destroy xprt %p\n", xprt); |
| 916 | 922 | ||
| 917 | xs_close(xprt); | 923 | xs_close(xprt); |
| 918 | xs_free_peer_addresses(xprt); | 924 | xs_xprt_free(xprt); |
| 919 | xprt_free(xprt); | ||
| 920 | module_put(THIS_MODULE); | 925 | module_put(THIS_MODULE); |
| 921 | } | 926 | } |
| 922 | 927 | ||
| @@ -2740,7 +2745,7 @@ static struct rpc_xprt *xs_setup_local(struct xprt_create *args) | |||
| 2740 | return xprt; | 2745 | return xprt; |
| 2741 | ret = ERR_PTR(-EINVAL); | 2746 | ret = ERR_PTR(-EINVAL); |
| 2742 | out_err: | 2747 | out_err: |
| 2743 | xprt_free(xprt); | 2748 | xs_xprt_free(xprt); |
| 2744 | return ret; | 2749 | return ret; |
| 2745 | } | 2750 | } |
| 2746 | 2751 | ||
| @@ -2818,7 +2823,7 @@ static struct rpc_xprt *xs_setup_udp(struct xprt_create *args) | |||
| 2818 | return xprt; | 2823 | return xprt; |
| 2819 | ret = ERR_PTR(-EINVAL); | 2824 | ret = ERR_PTR(-EINVAL); |
| 2820 | out_err: | 2825 | out_err: |
| 2821 | xprt_free(xprt); | 2826 | xs_xprt_free(xprt); |
| 2822 | return ret; | 2827 | return ret; |
| 2823 | } | 2828 | } |
| 2824 | 2829 | ||
| @@ -2893,12 +2898,11 @@ static struct rpc_xprt *xs_setup_tcp(struct xprt_create *args) | |||
| 2893 | xprt->address_strings[RPC_DISPLAY_ADDR], | 2898 | xprt->address_strings[RPC_DISPLAY_ADDR], |
| 2894 | xprt->address_strings[RPC_DISPLAY_PROTO]); | 2899 | xprt->address_strings[RPC_DISPLAY_PROTO]); |
| 2895 | 2900 | ||
| 2896 | |||
| 2897 | if (try_module_get(THIS_MODULE)) | 2901 | if (try_module_get(THIS_MODULE)) |
| 2898 | return xprt; | 2902 | return xprt; |
| 2899 | ret = ERR_PTR(-EINVAL); | 2903 | ret = ERR_PTR(-EINVAL); |
| 2900 | out_err: | 2904 | out_err: |
| 2901 | xprt_free(xprt); | 2905 | xs_xprt_free(xprt); |
| 2902 | return ret; | 2906 | return ret; |
| 2903 | } | 2907 | } |
| 2904 | 2908 | ||
| @@ -2981,13 +2985,12 @@ static struct rpc_xprt *xs_setup_bc_tcp(struct xprt_create *args) | |||
| 2981 | */ | 2985 | */ |
| 2982 | xprt_set_connected(xprt); | 2986 | xprt_set_connected(xprt); |
| 2983 | 2987 | ||
| 2984 | |||
| 2985 | if (try_module_get(THIS_MODULE)) | 2988 | if (try_module_get(THIS_MODULE)) |
| 2986 | return xprt; | 2989 | return xprt; |
| 2987 | xprt_put(xprt); | 2990 | xprt_put(xprt); |
| 2988 | ret = ERR_PTR(-EINVAL); | 2991 | ret = ERR_PTR(-EINVAL); |
| 2989 | out_err: | 2992 | out_err: |
| 2990 | xprt_free(xprt); | 2993 | xs_xprt_free(xprt); |
| 2991 | return ret; | 2994 | return ret; |
| 2992 | } | 2995 | } |
| 2993 | 2996 | ||
