aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid S. Miller <davem@davemloft.net>2017-12-28 14:28:23 -0500
committerDavid S. Miller <davem@davemloft.net>2017-12-28 14:28:23 -0500
commitd5902f6d1fbdb27e6a33c418063466d94be9dfa2 (patch)
tree832c9d8b395b29e905c8dd0f32003730c330177a
parentf72c4ac695573699dde5b71da1c3b9ef80440616 (diff)
parentd66fa9ec53c43bba9fa973c16419f6061b7cc3ea (diff)
downloadlinux-d5902f6d1fbdb27e6a33c418063466d94be9dfa2.tar.gz
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.h5
-rw-r--r--net/strparser/strparser.c2
2 files changed, 6 insertions, 1 deletions
diff --git a/include/net/sock.h b/include/net/sock.h
index 9155da42269208..7a7b14e9628a11 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)
return sk->sk_lock.owned;
}
+static inline bool sock_owned_by_user_nocheck(const struct sock *sk)
+{
+ return sk->sk_lock.owned;
+}
+
/* no reclassification while locks are held */
static inline bool sock_allow_reclassification(const struct sock *csk)
{
diff --git a/net/strparser/strparser.c b/net/strparser/strparser.c
index c5fda15ba3193f..1fdab5c4eda8c2 100644
--- a/net/strparser/strparser.c
+++ b/net/strparser/strparser.c
@@ -401,7 +401,7 @@ void strp_data_ready(struct strparser *strp)
* allows a thread in BH context to safely check if the process
* lock is held. In this case, if the lock is held, queue work.
*/
- if (sock_owned_by_user(strp->sk)) {
+ if (sock_owned_by_user_nocheck(strp->sk)) {
queue_work(strp_wq, &strp->work);
return;
}