Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 64235
b: refs/heads/master
c: 34b4e4a
h: refs/heads/master
i:
  64233: 5bccf15
  64231: 40d30e6
v: v3
  • Loading branch information
Alan Cox authored and Linus Torvalds committed Aug 23, 2007
1 parent f9fa8df commit 47bdd89
Show file tree
Hide file tree
Showing 8 changed files with 27 additions and 17 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: afe1ab4d577892822de2c8e803fbfaed6ec44ba3
refs/heads/master: 34b4e4aa3c470ce8fa2bd78abb1741b4b58baad7
2 changes: 1 addition & 1 deletion trunk/include/linux/mm.h
Original file line number Diff line number Diff line change
Expand Up @@ -1042,7 +1042,7 @@ static inline void vma_nonlinear_insert(struct vm_area_struct *vma,
}

/* 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 *,
Expand Down
20 changes: 15 additions & 5 deletions trunk/include/linux/security.h
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ extern int cap_inode_removexattr(struct dentry *dentry, char *name);
extern int cap_task_post_setuid (uid_t old_ruid, uid_t old_euid, uid_t old_suid, int flags);
extern void cap_task_reparent_to_init (struct task_struct *p);
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;
Expand Down Expand Up @@ -1125,6 +1125,7 @@ struct request_sock;
* 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.
*
Expand Down Expand Up @@ -1169,7 +1170,7 @@ struct security_operations {
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);
Expand Down Expand Up @@ -1469,10 +1470,14 @@ static inline int security_settime(struct timespec *ts, struct timezone *tz)
return security_ops->settime(ts, tz);
}


static inline int security_vm_enough_memory(long pages)
{
return security_ops->vm_enough_memory(pages);
return security_ops->vm_enough_memory(current->mm, pages);
}

static inline int security_vm_enough_memory_mm(struct mm_struct *mm, long pages)
{
return security_ops->vm_enough_memory(mm, pages);
}

static inline int security_bprm_alloc (struct linux_binprm *bprm)
Expand Down Expand Up @@ -2219,7 +2224,12 @@ static inline int security_settime(struct timespec *ts, struct timezone *tz)

static inline int security_vm_enough_memory(long pages)
{
return cap_vm_enough_memory(pages);
return cap_vm_enough_memory(current->mm, pages);
}

static inline int security_vm_enough_memory_mm(struct mm_struct *mm, long pages)
{
return cap_vm_enough_memory(mm, pages);
}

static inline int security_bprm_alloc (struct linux_binprm *bprm)
Expand Down
6 changes: 3 additions & 3 deletions trunk/mm/mmap.c
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,7 @@ atomic_t vm_committed_space = ATOMIC_INIT(0);
* 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;

Expand Down Expand Up @@ -166,7 +166,7 @@ int __vm_enough_memory(long pages, int cap_sys_admin)

/* 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;

/*
* cast `allowed' as a signed long because vm_committed_space
Expand Down Expand Up @@ -2077,7 +2077,7 @@ int insert_vm_struct(struct mm_struct * mm, struct vm_area_struct * vma)
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;
Expand Down
2 changes: 1 addition & 1 deletion trunk/mm/nommu.c
Original file line number Diff line number Diff line change
Expand Up @@ -1270,7 +1270,7 @@ EXPORT_SYMBOL(get_unmapped_area);
* 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;

Expand Down
4 changes: 2 additions & 2 deletions trunk/security/commoncap.c
Original file line number Diff line number Diff line change
Expand Up @@ -315,13 +315,13 @@ int cap_syslog (int type)
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);
Expand Down
4 changes: 2 additions & 2 deletions trunk/security/dummy.c
Original file line number Diff line number Diff line change
Expand Up @@ -108,13 +108,13 @@ static int dummy_settime(struct timespec *ts, struct timezone *tz)
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)
Expand Down
4 changes: 2 additions & 2 deletions trunk/security/selinux/hooks.c
Original file line number Diff line number Diff line change
Expand Up @@ -1584,7 +1584,7 @@ static int selinux_syslog(int type)
* 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;
Expand All @@ -1600,7 +1600,7 @@ static int selinux_vm_enough_memory(long pages)
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 */
Expand Down

0 comments on commit 47bdd89

Please sign in to comment.