kcov: detect double association with a single task

"Linux Kernel Mailing List" <[email protected]>
Newsgroups gmane.linux.kernel.commits.head
Message-ID <[email protected]>
Web:        https://git.kernel.org/torvalds/c/a77660d231f8b3d84fd23ed482e0964f7aa546d6
Commit:     a77660d231f8b3d84fd23ed482e0964f7aa546d6
Parent:     a1be1f3931bfe0a42b46fef77a04593c2b136e7f
Refname:    refs/heads/master
Author:     Dmitry Vyukov <[email protected]>
AuthorDate: Tue Feb 6 15:40:28 2018 -0800
Committer:  Linus Torvalds <[email protected]>
CommitDate: Tue Feb 6 18:32:46 2018 -0800

    kcov: detect double association with a single task
    
    Currently KCOV_ENABLE does not check if the current task is already
    associated with another kcov descriptor.  As the result it is possible
    to associate a single task with more than one kcov descriptor, which
    later leads to a memory leak of the old descriptor.  This relation is
    really meant to be one-to-one (task has only one back link).
    
    Extend validation to detect such misuse.
    
    Link: http://lkml.kernel.org/r/[email protected]
    Fixes: 5c9a8750a640 ("kernel: add kcov code coverage")
    Signed-off-by: Dmitry Vyukov <[email protected]>
    Reported-by: Shankara Pailoor <[email protected]>
    Cc: Dmitry Vyukov <[email protected]>
    Cc: syzbot <[email protected]>
    Signed-off-by: Andrew Morton <[email protected]>
    Signed-off-by: Linus Torvalds <[email protected]>
---
 kernel/kcov.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/kernel/kcov.c b/kernel/kcov.c
index 7594c033d98a..2c16f1ab5e10 100644
--- a/kernel/kcov.c
+++ b/kernel/kcov.c
@@ -358,7 +358,8 @@ static int kcov_ioctl_locked(struct kcov *kcov, unsigned int cmd,
 		 */
 		if (kcov->mode != KCOV_MODE_INIT || !kcov->area)
 			return -EINVAL;
-		if (kcov->t != NULL)
+		t = current;
+		if (kcov->t != NULL || t->kcov != NULL)
 			return -EBUSY;
 		if (arg == KCOV_TRACE_PC)
 			kcov->mode = KCOV_MODE_TRACE_PC;
@@ -370,7 +371,6 @@ static int kcov_ioctl_locked(struct kcov *kcov, unsigned int cmd,
 #endif
 		else
 			return -EINVAL;
-		t = current;
 		/* Cache in task struct for performance. */
 		t->kcov_size = kcov->size;
 		t->kcov_area = kcov->area;
--
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.