public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: Cyrill Gorcunov <gorcunov@gmail.com>
To: Alan Cox <alan@lxorguk.ukuu.org.uk>
Cc: WU Fengguang <wfg@mail.ustc.edu.cn>,
	Balbir Singh <balbir@linux.vnet.ibm.com>,
	Andrew Morton <akpm@linux-foundation.org>,
	linux-kernel <linux-kernel@vger.kernel.org>,
	Paul Moore <paul.moore@hp.com>,
	Stephen Smalley <sds@epoch.ncsc.mil>,
	Chris Vance <cvance@nai.com>, Wayne Salamon <wsalamon@nai.com>,
	James Morris <jmorris@redhat.com>,
	dgoeddel@trustedcs.com
Subject: Re: [BUGFIX] NULL pointer dereference in __vm_enough_memory()
Date: Sun, 12 Aug 2007 20:21:43 +0400	[thread overview]
Message-ID: <20070812162143.GA7202@cvg> (raw)
In-Reply-To: <20070812161744.200d4252@the-village.bc.nu>

[Alan Cox - Sun, Aug 12, 2007 at 04:17:44PM +0100]
| Try this (it compiles but isnt tested). Its a weekend here, the sun is
| shining, the beach is a short walk, and I have more interesting things to
| do right now 8)
| 
| 
| diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla-2.6.23rc1-mm1/include/linux/mm.h linux-2.6.23rc1-mm1/include/linux/mm.h
| --- linux.vanilla-2.6.23rc1-mm1/include/linux/mm.h	2007-07-26 15:02:58.000000000 +0100
| +++ linux-2.6.23rc1-mm1/include/linux/mm.h	2007-08-12 13:54:24.614647536 +0100
| @@ -1079,7 +1079,7 @@
|  }
|  
|  /* mmap.c */
| -extern int __vm_enough_memory(long pages, int cap_sys_admin);
| +extern int __vm_enough_memory(struct mm_struct *mm, long pages, int cap_sys_admin);
|  extern void vma_adjust(struct vm_area_struct *vma, unsigned long start,
|  	unsigned long end, pgoff_t pgoff, struct vm_area_struct *insert);
|  extern struct vm_area_struct *vma_merge(struct mm_struct *,
| diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla-2.6.23rc1-mm1/include/linux/security.h linux-2.6.23rc1-mm1/include/linux/security.h
| --- linux.vanilla-2.6.23rc1-mm1/include/linux/security.h	2007-07-26 15:02:58.000000000 +0100
| +++ linux-2.6.23rc1-mm1/include/linux/security.h	2007-08-12 14:13:10.383504656 +0100
| @@ -58,7 +58,7 @@
|  extern int cap_task_setioprio (struct task_struct *p, int ioprio);
|  extern int cap_task_setnice (struct task_struct *p, int nice);
|  extern int cap_syslog (int type);
| -extern int cap_vm_enough_memory (long pages);
| +extern int cap_vm_enough_memory (struct mm_struct *mm, long pages);
|  
|  struct msghdr;
|  struct sk_buff;
| @@ -1129,6 +1129,7 @@
|   *	Return 0 if permission is granted.
|   * @vm_enough_memory:
|   *	Check permissions for allocating a new virtual mapping.
| + *	@mm contains the mm struct it is being added to.
|   *      @pages contains the number of pages.
|   *	Return 0 if permission is granted.
|   *
| @@ -1173,7 +1174,7 @@
|  	int (*quota_on) (struct dentry * dentry);
|  	int (*syslog) (int type);
|  	int (*settime) (struct timespec *ts, struct timezone *tz);
| -	int (*vm_enough_memory) (long pages);
| +	int (*vm_enough_memory) (struct mm_struct *mm, long pages);
|  
|  	int (*bprm_alloc_security) (struct linux_binprm * bprm);
|  	void (*bprm_free_security) (struct linux_binprm * bprm);
| @@ -1439,6 +1440,7 @@
|  int security_syslog(int type);
|  int security_settime(struct timespec *ts, struct timezone *tz);
|  int security_vm_enough_memory(long pages);
| +int security_vm_enough_memory_mm(struct mm_struct *mm, long pages);
|  int security_bprm_alloc(struct linux_binprm *bprm);
|  void security_bprm_free(struct linux_binprm *bprm);
|  void security_bprm_apply_creds(struct linux_binprm *bprm, int unsafe);
| diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla-2.6.23rc1-mm1/mm/mmap.c linux-2.6.23rc1-mm1/mm/mmap.c
| --- linux.vanilla-2.6.23rc1-mm1/mm/mmap.c	2007-07-26 15:02:58.000000000 +0100
| +++ linux-2.6.23rc1-mm1/mm/mmap.c	2007-08-12 13:53:22.000000000 +0100
| @@ -93,7 +93,7 @@
|   * Note this is a helper function intended to be used by LSMs which
|   * wish to use this logic.
|   */
| -int __vm_enough_memory(long pages, int cap_sys_admin)
| +int __vm_enough_memory(struct mm_struct *mm, long pages, int cap_sys_admin)
|  {
|  	unsigned long free, allowed;
|  
| @@ -166,7 +166,7 @@
|  
|  	/* Don't let a single process grow too big:
|  	   leave 3% of the size of this process for other processes */
| -	allowed -= current->mm->total_vm / 32;
| +	allowed -= mm->total_vm / 32;

So mm->total_vm is 0 for __bprm_mm_init case. Is that ok? Or I miss
something?

|  
|  	/*
|  	 * cast `allowed' as a signed long because vm_committed_space
| @@ -2058,7 +2058,7 @@
|  	if (__vma && __vma->vm_start < vma->vm_end)
|  		return -ENOMEM;
|  	if ((vma->vm_flags & VM_ACCOUNT) &&
| -	     security_vm_enough_memory(vma_pages(vma)))
| +	     security_vm_enough_memory_mm(mm, vma_pages(vma)))
|  		return -ENOMEM;
|  	vma_link(mm, vma, prev, rb_link, rb_parent);
|  	return 0;
| diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla-2.6.23rc1-mm1/mm/nommu.c linux-2.6.23rc1-mm1/mm/nommu.c
| --- linux.vanilla-2.6.23rc1-mm1/mm/nommu.c	2007-07-26 15:02:08.000000000 +0100
| +++ linux-2.6.23rc1-mm1/mm/nommu.c	2007-08-12 13:53:57.000000000 +0100
| @@ -1270,7 +1270,7 @@
|   * Note this is a helper function intended to be used by LSMs which
|   * wish to use this logic.
|   */
| -int __vm_enough_memory(long pages, int cap_sys_admin)
| +int __vm_enough_memory(struct mm_struct *mm, long pages, int cap_sys_admin)
|  {
|  	unsigned long free, allowed;
|  
| diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla-2.6.23rc1-mm1/security/commoncap.c linux-2.6.23rc1-mm1/security/commoncap.c
| --- linux.vanilla-2.6.23rc1-mm1/security/commoncap.c	2007-07-26 15:02:59.000000000 +0100
| +++ linux-2.6.23rc1-mm1/security/commoncap.c	2007-08-12 14:13:29.000000000 +0100
| @@ -489,13 +489,13 @@
|  	return 0;
|  }
|  
| -int cap_vm_enough_memory(long pages)
| +int cap_vm_enough_memory(struct mm_struct *mm, long pages)
|  {
|  	int cap_sys_admin = 0;
|  
|  	if (cap_capable(current, CAP_SYS_ADMIN) == 0)
|  		cap_sys_admin = 1;
| -	return __vm_enough_memory(pages, cap_sys_admin);
| +	return __vm_enough_memory(mm, pages, cap_sys_admin);
|  }
|  
|  EXPORT_SYMBOL(cap_capable);
| diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla-2.6.23rc1-mm1/security/dummy.c linux-2.6.23rc1-mm1/security/dummy.c
| --- linux.vanilla-2.6.23rc1-mm1/security/dummy.c	2007-07-26 15:02:59.000000000 +0100
| +++ linux-2.6.23rc1-mm1/security/dummy.c	2007-08-12 14:10:49.000000000 +0100
| @@ -107,13 +107,13 @@
|  	return 0;
|  }
|  
| -static int dummy_vm_enough_memory(long pages)
| +static int dummy_vm_enough_memory(struct mm_struct *mm, long pages)
|  {
|  	int cap_sys_admin = 0;
|  
|  	if (dummy_capable(current, CAP_SYS_ADMIN) == 0)
|  		cap_sys_admin = 1;
| -	return __vm_enough_memory(pages, cap_sys_admin);
| +	return __vm_enough_memory(mm, pages, cap_sys_admin);
|  }
|  
|  static int dummy_bprm_alloc_security (struct linux_binprm *bprm)
| diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla-2.6.23rc1-mm1/security/security.c linux-2.6.23rc1-mm1/security/security.c
| --- linux.vanilla-2.6.23rc1-mm1/security/security.c	2007-07-26 15:02:59.000000000 +0100
| +++ linux-2.6.23rc1-mm1/security/security.c	2007-08-12 13:47:53.000000000 +0100
| @@ -237,10 +237,14 @@
|  	return security_ops->settime(ts, tz);
|  }
|  
| -
|  int security_vm_enough_memory(long pages)
|  {
| -	return security_ops->vm_enough_memory(pages);
| +	return security_ops->vm_enough_memory(current->mm, pages);
| +}
| +
| +int security_vm_enough_memory_mm(struct mm_struct *mm, long pages)
| +{
| +	return security_ops->vm_enough_memory(mm, pages);
|  }
|  
|  int security_bprm_alloc(struct linux_binprm *bprm)
| diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla-2.6.23rc1-mm1/security/selinux/hooks.c linux-2.6.23rc1-mm1/security/selinux/hooks.c
| --- linux.vanilla-2.6.23rc1-mm1/security/selinux/hooks.c	2007-07-26 15:02:59.000000000 +0100
| +++ linux-2.6.23rc1-mm1/security/selinux/hooks.c	2007-08-12 14:11:21.000000000 +0100
| @@ -1584,7 +1584,7 @@
|   * Do not audit the selinux permission check, as this is applied to all
|   * processes that allocate mappings.
|   */
| -static int selinux_vm_enough_memory(long pages)
| +static int selinux_vm_enough_memory(struct mm_struct *mm, long pages)
|  {
|  	int rc, cap_sys_admin = 0;
|  	struct task_security_struct *tsec = current->security;
| @@ -1600,7 +1600,7 @@
|  	if (rc == 0)
|  		cap_sys_admin = 1;
|  
| -	return __vm_enough_memory(pages, cap_sys_admin);
| +	return __vm_enough_memory(mm, pages, cap_sys_admin);
|  }
|  
|  /* binprm security operations */

		Cyrill


  reply	other threads:[~2007-08-12 16:22 UTC|newest]

Thread overview: 29+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <46BEF5C0.3080902@linux.vnet.ibm.com>
     [not found] ` <20070812120902.GA9972@mail.ustc.edu.cn>
     [not found]   ` <20070812122746.GA10109@mail.ustc.edu.cn>
2007-08-12 12:27     ` [BUGFIX] NULL pointer dereference in __vm_enough_memory() WU Fengguang
2007-08-12 13:19       ` Alan Cox
     [not found]         ` <20070812140917.GA13683@mail.ustc.edu.cn>
2007-08-12 14:09           ` WU Fengguang
2007-08-12 15:17             ` Alan Cox
2007-08-12 16:21               ` Cyrill Gorcunov [this message]
     [not found]                 ` <20070813002342.GA6908@mail.ustc.edu.cn>
2007-08-13  0:23                   ` WU Fengguang
2007-08-13  9:53                   ` Cyrill Gorcunov
2007-08-13 11:22                     ` Alan Cox
2007-08-13 11:55                       ` Cyrill Gorcunov
2007-08-13  0:14               ` Rene Herman
     [not found]               ` <20070813073853.GA5262@mail.ustc.edu.cn>
2007-08-13  7:38                 ` WU Fengguang
2007-08-13 13:01                   ` [PATCH] fix " Alan Cox
2007-08-14  5:01                     ` Andrew Morton
2007-08-14 17:50                       ` Tobias Diedrich
2007-08-14 17:10     ` [BUGFIX] " Andy Isaacson
     [not found]       ` <20070815085308.GA18959@mail.ustc.edu.cn>
2007-08-15  8:53         ` WU Fengguang
     [not found] <20070811132131.GA13775@mail.ustc.edu.cn>
2007-08-11 13:21 ` Fengguang Wu
2007-08-11 14:30   ` Balbir Singh
2007-08-11 17:00     ` Andrew Morton
2007-08-11 18:01       ` Balbir Singh
2007-08-11 18:13         ` Cyrill Gorcunov
     [not found]         ` <20070812054831.GB8992@mail.ustc.edu.cn>
2007-08-12  5:48           ` WU Fengguang
     [not found]           ` <20070812085808.GA7239@mail.ustc.edu.cn>
2007-08-12  8:58             ` WU Fengguang
2007-08-12  9:25               ` Balbir Singh
2007-08-12 12:23                 ` Cyrill Gorcunov
     [not found]       ` <20070812054606.GA8992@mail.ustc.edu.cn>
2007-08-12  5:46         ` WU Fengguang
2007-08-11 14:17 ` Cyrill Gorcunov
     [not found]   ` <20070812052915.GA6769@mail.ustc.edu.cn>
2007-08-12  5:29     ` Fengguang Wu
2007-08-12  5:45     ` Cyrill Gorcunov

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20070812162143.GA7202@cvg \
    --to=gorcunov@gmail.com \
    --cc=akpm@linux-foundation.org \
    --cc=alan@lxorguk.ukuu.org.uk \
    --cc=balbir@linux.vnet.ibm.com \
    --cc=cvance@nai.com \
    --cc=dgoeddel@trustedcs.com \
    --cc=jmorris@redhat.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=paul.moore@hp.com \
    --cc=sds@epoch.ncsc.mil \
    --cc=wfg@mail.ustc.edu.cn \
    --cc=wsalamon@nai.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox