Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 222727
b: refs/heads/master
c: 3c77f84
h: refs/heads/master
i:
  222725: 4bf51fb
  222723: cfb0ab3
  222719: f858628
v: v3
  • Loading branch information
Oleg Nesterov authored and Linus Torvalds committed Dec 1, 2010
1 parent 338e375 commit 3ee6820
Show file tree
Hide file tree
Showing 3 changed files with 32 additions and 3 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: 37a09f07459753e7c98d4e21f1c61e8756923f81
refs/heads/master: 3c77f845722158206a7209c45ccddc264d19319c
32 changes: 30 additions & 2 deletions trunk/fs/exec.c
Original file line number Diff line number Diff line change
Expand Up @@ -164,6 +164,25 @@ SYSCALL_DEFINE1(uselib, const char __user *, library)

#ifdef CONFIG_MMU

static void acct_arg_size(struct linux_binprm *bprm, unsigned long pages)
{
struct mm_struct *mm = current->mm;
long diff = (long)(pages - bprm->vma_pages);

if (!mm || !diff)
return;

bprm->vma_pages = pages;

#ifdef SPLIT_RSS_COUNTING
add_mm_counter(mm, MM_ANONPAGES, diff);
#else
spin_lock(&mm->page_table_lock);
add_mm_counter(mm, MM_ANONPAGES, diff);
spin_unlock(&mm->page_table_lock);
#endif
}

static struct page *get_arg_page(struct linux_binprm *bprm, unsigned long pos,
int write)
{
Expand All @@ -186,6 +205,8 @@ static struct page *get_arg_page(struct linux_binprm *bprm, unsigned long pos,
unsigned long size = bprm->vma->vm_end - bprm->vma->vm_start;
struct rlimit *rlim;

acct_arg_size(bprm, size / PAGE_SIZE);

/*
* We've historically supported up to 32 pages (ARG_MAX)
* of argument strings even with small stacks
Expand Down Expand Up @@ -276,6 +297,10 @@ static bool valid_arg_len(struct linux_binprm *bprm, long len)

#else

static inline void acct_arg_size(struct linux_binprm *bprm, unsigned long pages)
{
}

static struct page *get_arg_page(struct linux_binprm *bprm, unsigned long pos,
int write)
{
Expand Down Expand Up @@ -1003,6 +1028,7 @@ int flush_old_exec(struct linux_binprm * bprm)
/*
* Release all of the old mmap stuff
*/
acct_arg_size(bprm, 0);
retval = exec_mmap(bprm->mm);
if (retval)
goto out;
Expand Down Expand Up @@ -1426,8 +1452,10 @@ int do_execve(const char * filename,
return retval;

out:
if (bprm->mm)
mmput (bprm->mm);
if (bprm->mm) {
acct_arg_size(bprm, 0);
mmput(bprm->mm);
}

out_file:
if (bprm->file) {
Expand Down
1 change: 1 addition & 0 deletions trunk/include/linux/binfmts.h
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ struct linux_binprm{
char buf[BINPRM_BUF_SIZE];
#ifdef CONFIG_MMU
struct vm_area_struct *vma;
unsigned long vma_pages;
#else
# define MAX_ARG_PAGES 32
struct page *page[MAX_ARG_PAGES];
Expand Down

0 comments on commit 3ee6820

Please sign in to comment.