diff options
author | David S. Miller <davem@davemloft.net> | 2017-12-28 14:28:23 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2017-12-28 14:28:23 -0500 |
commit | d5902f6d1fbdb27e6a33c418063466d94be9dfa2 (patch) | |
tree | 832c9d8b395b29e905c8dd0f32003730c330177a | |
parent | f72c4ac695573699dde5b71da1c3b9ef80440616 (diff) | |
parent | d66fa9ec53c43bba9fa973c16419f6061b7cc3ea (diff) |
Merge branch 'strparser-Fix-lockdep-issue'
Tom Herbert says:
====================
strparser: Fix lockdep issue
When sock_owned_by_user returns true in strparser. Fix is to add and
call sock_owned_by_user_nocheck since the check for owned by user is
not an error condition in this case.
====================
Fixes: 43a0c6751a322847 ("strparser: Stream parser for messages")
Reported-by: syzbot <syzkaller@googlegroups.com>
Reported-and-tested-by: <syzbot+c91c53af67f9ebe599a337d2e70950366153b295@syzkaller.appspotmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | include/net/sock.h | 5 | ||||
-rw-r--r-- | net/strparser/strparser.c | 2 |
2 files changed, 6 insertions, 1 deletions
diff --git a/include/net/sock.h b/include/net/sock.h index 9155da422692..7a7b14e9628a 100644 --- a/include/net/sock.h +++ b/include/net/sock.h | |||
@@ -1514,6 +1514,11 @@ static inline bool sock_owned_by_user(const struct sock *sk) | |||
1514 | return sk->sk_lock.owned; | 1514 | return sk->sk_lock.owned; |
1515 | } | 1515 | } |
1516 | 1516 | ||
1517 | static inline bool sock_owned_by_user_nocheck(const struct sock *sk) | ||
1518 | { | ||
1519 | return sk->sk_lock.owned; | ||
1520 | } | ||
1521 | |||
1517 | /* no reclassification while locks are held */ | 1522 | /* no reclassification while locks are held */ |
1518 | static inline bool sock_allow_reclassification(const struct sock *csk) | 1523 | static inline bool sock_allow_reclassification(const struct sock *csk) |
1519 | { | 1524 | { |
diff --git a/net/strparser/strparser.c b/net/strparser/strparser.c index c5fda15ba319..1fdab5c4eda8 100644 --- a/net/strparser/strparser.c +++ b/net/strparser/strparser.c | |||
@@ -401,7 +401,7 @@ void strp_data_ready(struct strparser *strp) | |||
401 | * allows a thread in BH context to safely check if the process | 401 | * allows a thread in BH context to safely check if the process |
402 | * lock is held. In this case, if the lock is held, queue work. | 402 | * lock is held. In this case, if the lock is held, queue work. |
403 | */ | 403 | */ |
404 | if (sock_owned_by_user(strp->sk)) { | 404 | if (sock_owned_by_user_nocheck(strp->sk)) { |
405 | queue_work(strp_wq, &strp->work); | 405 | queue_work(strp_wq, &strp->work); |
406 | return; | 406 | return; |
407 | } | 407 | } |