From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1756132AbcHVPmL (ORCPT ); Mon, 22 Aug 2016 11:42:11 -0400 Received: from mx1.redhat.com ([209.132.183.28]:53306 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755532AbcHVPmJ (ORCPT ); Mon, 22 Aug 2016 11:42:09 -0400 From: Richard Guy Briggs To: linux-audit@redhat.com, linux-kernel@vger.kernel.org Cc: Richard Guy Briggs , mguzik@redhat.com, ebiederm@xmission.com, oleg@redhat.com, skinsbursky@virtuozzo.com, luto@amacapital.net, sgrubb@redhat.com, pmoore@redhat.com, eparis@redhat.com Subject: [PATCH] audit: fix audit_exe_compare using get_mm_exe_file Date: Mon, 22 Aug 2016 11:41:34 -0400 Message-Id: <843cd1056b76a3c28585e5b6d711fe53d4f78c18.1471879964.git.rgb@redhat.com> X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.29]); Mon, 22 Aug 2016 15:42:09 +0000 (UTC) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Fix original naive attempt to get/lock access to task->mm->exe_file by using get_mm_exe_file and checking for NULL. See: https://lkml.org/lkml/2016/7/30/97 Signed-off-by: Richard Guy Briggs --- kernel/audit_watch.c | 13 ++++++++++--- 1 files changed, 10 insertions(+), 3 deletions(-) diff --git a/kernel/audit_watch.c b/kernel/audit_watch.c index d6709eb..0b29279 100644 --- a/kernel/audit_watch.c +++ b/kernel/audit_watch.c @@ -19,6 +19,7 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ +#include #include #include #include @@ -540,14 +541,20 @@ int audit_dupe_exe(struct audit_krule *new, struct audit_krule *old) int audit_exe_compare(struct task_struct *tsk, struct audit_fsnotify_mark *mark) { + struct mm_struct *mm; struct file *exe_file; unsigned long ino; dev_t dev; - rcu_read_lock(); - exe_file = rcu_dereference(tsk->mm->exe_file); + mm = get_task_mm(tsk); + if (!mm) + return 0; + exe_file = get_mm_exe_file(mm); + mmput(mm); + if (!exe_file) + return 0; ino = exe_file->f_inode->i_ino; dev = exe_file->f_inode->i_sb->s_dev; - rcu_read_unlock(); + fput(exe_file); return audit_mark_compare(mark, ino, dev); } -- 1.7.1