Re: [PATCH] net: inet: diag: Fix an error handling
Le 12/09/2016 à 16:35, David Ahern a écrit : On 9/12/16 12:02 AM, Christophe JAILLET wrote: diff --git a/net/ipv4/inet_diag.c b/net/ipv4/inet_diag.c index abfbe492ebfe..795af25cf84c 100644 --- a/net/ipv4/inet_diag.c +++ b/net/ipv4/inet_diag.c @@ -1134,7 +1134,6 @@ int inet_diag_handler_get_info(struct sk_buff *skb, struct sock *sk) handler = inet_diag_lock_handler(sk->sk_protocol); if (IS_ERR(handler)) { - inet_diag_unlock_handler(handler); nlmsg_cancel(skb, nlh); return PTR_ERR(handler); } That call is needed. inet_diag_unlock_handler does not operate on the input arg but a global mutex. Perhaps a better patch is to change inet_diag_unlock_handler() to a void. This is obvious. Sorry for the noise. CJ
Re: [PATCH] net: inet: diag: Fix an error handling
On 9/12/16 12:02 AM, Christophe JAILLET wrote: > diff --git a/net/ipv4/inet_diag.c b/net/ipv4/inet_diag.c > index abfbe492ebfe..795af25cf84c 100644 > --- a/net/ipv4/inet_diag.c > +++ b/net/ipv4/inet_diag.c > @@ -1134,7 +1134,6 @@ int inet_diag_handler_get_info(struct sk_buff *skb, > struct sock *sk) > > handler = inet_diag_lock_handler(sk->sk_protocol); > if (IS_ERR(handler)) { > - inet_diag_unlock_handler(handler); > nlmsg_cancel(skb, nlh); > return PTR_ERR(handler); > } > That call is needed. inet_diag_unlock_handler does not operate on the input arg but a global mutex. Perhaps a better patch is to change inet_diag_unlock_handler() to a void.
[PATCH] net: inet: diag: Fix an error handling
If 'inet_diag_lock_handler()' returns an error, we should not call 'inet_diag_unlock_handler()' on it. 'handler' is not a valid mutexc in this case. This has been spotted with the folowing coccinelle script: @@ expression x; identifier f; @@ * if (IS_ERR(x)) { ... * f(<+... x ...+>); ... } Signed-off-by: Christophe JAILLET--- net/ipv4/inet_diag.c | 1 - 1 file changed, 1 deletion(-) diff --git a/net/ipv4/inet_diag.c b/net/ipv4/inet_diag.c index abfbe492ebfe..795af25cf84c 100644 --- a/net/ipv4/inet_diag.c +++ b/net/ipv4/inet_diag.c @@ -1134,7 +1134,6 @@ int inet_diag_handler_get_info(struct sk_buff *skb, struct sock *sk) handler = inet_diag_lock_handler(sk->sk_protocol); if (IS_ERR(handler)) { - inet_diag_unlock_handler(handler); nlmsg_cancel(skb, nlh); return PTR_ERR(handler); } -- 2.7.4