Skip to content

Commit

Permalink
exec: introduce get_user_arg_ptr() helper
Browse files Browse the repository at this point in the history
Introduce get_user_arg_ptr() helper, convert count() and copy_strings()
to use it.

No functional changes, preparation. This helper is trivial, it just
reads the pointer from argv/envp user-space array.

Signed-off-by: Oleg Nesterov <[email protected]>
Reviewed-by: KOSAKI Motohiro <[email protected]>
Tested-by: KOSAKI Motohiro <[email protected]>
  • Loading branch information
oleg-nesterov committed Apr 9, 2011
1 parent bb3c90f commit 1d1dbf8
Showing 1 changed file with 25 additions and 11 deletions.
36 changes: 25 additions & 11 deletions fs/exec.c
Original file line number Diff line number Diff line change
Expand Up @@ -398,6 +398,17 @@ int bprm_mm_init(struct linux_binprm *bprm)
return err;
}

static const char __user *
get_user_arg_ptr(const char __user * const __user *argv, int nr)
{
const char __user *ptr;

if (get_user(ptr, argv + nr))
return ERR_PTR(-EFAULT);

return ptr;
}

/*
* count() counts the number of strings in array ARGV.
*/
Expand All @@ -407,13 +418,14 @@ static int count(const char __user * const __user * argv, int max)

if (argv != NULL) {
for (;;) {
const char __user * p;
const char __user *p = get_user_arg_ptr(argv, i);

if (get_user(p, argv))
return -EFAULT;
if (!p)
break;
argv++;

if (IS_ERR(p))
return -EFAULT;

if (i++ >= max)
return -E2BIG;

Expand Down Expand Up @@ -443,16 +455,18 @@ static int copy_strings(int argc, const char __user *const __user *argv,
int len;
unsigned long pos;

if (get_user(str, argv+argc) ||
!(len = strnlen_user(str, MAX_ARG_STRLEN))) {
ret = -EFAULT;
ret = -EFAULT;
str = get_user_arg_ptr(argv, argc);
if (IS_ERR(str))
goto out;
}

if (!valid_arg_len(bprm, len)) {
ret = -E2BIG;
len = strnlen_user(str, MAX_ARG_STRLEN);
if (!len)
goto out;

ret = -E2BIG;
if (!valid_arg_len(bprm, len))
goto out;
}

/* We're going to work our way backwords. */
pos = bprm->p;
Expand Down

0 comments on commit 1d1dbf8

Please sign in to comment.