Re: [PATCH] SELinux: Fix memory leak upon loading policy

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Monday, January 06, 2014 09:28:15 PM Tetsuo Handa wrote:
> Hello.
> 
> I got below leak with linux-3.10.0-54.0.1.el7.x86_64 .
> 
> [  681.903890] kmemleak: 5538 new suspected memory leaks (see
> /sys/kernel/debug/kmemleak)
> 
> Below is a patch, but I don't know whether we need special handing for
> undoing ebitmap_set_bit() call.
> ----------
> 
> >From fe97527a90fe95e2239dfbaa7558f0ed559c0992 Mon Sep 17 00:00:00 2001
> 
> From: Tetsuo Handa <penguin-kernel@xxxxxxxxxxxxxxxxxxx>
> Date: Mon, 6 Jan 2014 16:30:21 +0900
> Subject: [PATCH] SELinux: Fix memory leak upon loading policy
> 
> Commit 2463c26d "SELinux: put name based create rules in a hashtable" did
> not check return value from hashtab_insert() in filename_trans_read(). It
> leaks memory if hashtab_insert() returns error.
> 
>   unreferenced object 0xffff88005c9160d0 (size 8):
>     comm "systemd", pid 1, jiffies 4294688674 (age 235.265s)
>     hex dump (first 8 bytes):
>       57 0b 00 00 6b 6b 6b a5                          W...kkk.
>     backtrace:
>       [<ffffffff816604ae>] kmemleak_alloc+0x4e/0xb0
>       [<ffffffff811cba5e>] kmem_cache_alloc_trace+0x12e/0x360
>       [<ffffffff812aec5d>] policydb_read+0xd1d/0xf70
>       [<ffffffff812b345c>] security_load_policy+0x6c/0x500
>       [<ffffffff812a623c>] sel_write_load+0xac/0x750
>       [<ffffffff811eb680>] vfs_write+0xc0/0x1f0
>       [<ffffffff811ec08c>] SyS_write+0x4c/0xa0
>       [<ffffffff81690419>] system_call_fastpath+0x16/0x1b
>       [<ffffffffffffffff>] 0xffffffffffffffff
> 
> However, we should not return EEXIST error to the caller, or the systemd
> will show below message and the boot sequence freezes.
> 
>   systemd[1]: Failed to load SELinux policy. Freezing.
> 
> Signed-off-by: Tetsuo Handa <penguin-kernel@xxxxxxxxxxxxxxxxxxx>
> ---
>  security/selinux/ss/policydb.c |   14 +++++++++++++-
>  1 files changed, 13 insertions(+), 1 deletions(-)
> 
> diff --git a/security/selinux/ss/policydb.c b/security/selinux/ss/policydb.c
> index f6195eb..c8985db 100644
> --- a/security/selinux/ss/policydb.c
> +++ b/security/selinux/ss/policydb.c
> @@ -1941,7 +1941,19 @@ static int filename_trans_read(struct policydb *p,
> void *fp) if (rc)
>  			goto out;
> 
> -		hashtab_insert(p->filename_trans, ft, otype);
> +		rc = hashtab_insert(p->filename_trans, ft, otype);
> +		if (rc) {
> +			/*
> +			 * Do not return -EEXIST to the caller, or the system
> +			 * will not boot.
> +			 */
> +			if (rc != -EEXIST)
> +				goto out;
> +			/* But free memory to avoid memory leak. */
> +			kfree(ft);
> +			kfree(name);
> +			kfree(otype);
> +		}
>  	}
>  	hash_eval(p->filename_trans, "filenametr");
>  	return 0;

Thanks for sending this patch.  Mimi found a similar issue a little while ago 
and found a number of hashtab_insert() failures which were causing a fair 
number of memory leaks.

I'm not going to merge this patch at the moment.  While we should check the 
return value of hashtab_insert(), and fix the memory leaks when it fails, I 
still want to better understand why that hashtab_insert() function is failing 
in the first place on what would appear to be a "normal" operation.  Ideally 
we would first resolve the hashtab_insert() failures, then we could check the 
return value, release the memory when necessary, and return errors to the 
caller.

-- 
paul moore
www.paul-moore.com

_______________________________________________
Selinux mailing list
Selinux@xxxxxxxxxxxxx
To unsubscribe, send email to Selinux-leave@xxxxxxxxxxxxx.
To get help, send an email containing "help" to Selinux-request@xxxxxxxxxxxxx.




[Index of Archives]     [Selinux Refpolicy]     [Linux SGX]     [Fedora Users]     [Fedora Desktop]     [Yosemite Photos]     [Yosemite Camping]     [Yosemite Campsites]     [KDE Users]     [Gnome Users]

  Powered by Linux