1306
1306
return do_sys_open(dfd, filename, flags, mode);
1310
* compat_count() counts the number of arguments/envelopes. It is basically
1311
* a copy of count() from fs/exec.c, except that it works with 32 bit argv
1312
* and envp pointers.
1314
static int compat_count(compat_uptr_t __user *argv, int max)
1322
if (get_user(p, argv))
1330
if (fatal_signal_pending(current))
1331
return -ERESTARTNOHAND;
1339
* compat_copy_strings() is basically a copy of copy_strings() from fs/exec.c
1340
* except that it works with 32 bit argv and envp pointers.
1342
static int compat_copy_strings(int argc, compat_uptr_t __user *argv,
1343
struct linux_binprm *bprm)
1345
struct page *kmapped_page = NULL;
1347
unsigned long kpos = 0;
1350
while (argc-- > 0) {
1355
if (get_user(str, argv+argc) ||
1356
!(len = strnlen_user(compat_ptr(str), MAX_ARG_STRLEN))) {
1361
if (len > MAX_ARG_STRLEN) {
1366
/* We're going to work our way backwords. */
1372
int offset, bytes_to_copy;
1374
if (fatal_signal_pending(current)) {
1375
ret = -ERESTARTNOHAND;
1380
offset = pos % PAGE_SIZE;
1384
bytes_to_copy = offset;
1385
if (bytes_to_copy > len)
1386
bytes_to_copy = len;
1388
offset -= bytes_to_copy;
1389
pos -= bytes_to_copy;
1390
str -= bytes_to_copy;
1391
len -= bytes_to_copy;
1393
if (!kmapped_page || kpos != (pos & PAGE_MASK)) {
1396
page = get_arg_page(bprm, pos, 1);
1403
flush_kernel_dcache_page(kmapped_page);
1404
kunmap(kmapped_page);
1405
put_page(kmapped_page);
1407
kmapped_page = page;
1408
kaddr = kmap(kmapped_page);
1409
kpos = pos & PAGE_MASK;
1410
flush_cache_page(bprm->vma, kpos,
1411
page_to_pfn(kmapped_page));
1413
if (copy_from_user(kaddr+offset, compat_ptr(str),
1423
flush_kernel_dcache_page(kmapped_page);
1424
kunmap(kmapped_page);
1425
put_page(kmapped_page);
1431
* compat_do_execve() is mostly a copy of do_execve(), with the exception
1432
* that it processes 32 bit argv and envp pointers.
1434
int compat_do_execve(char * filename,
1435
compat_uptr_t __user *argv,
1436
compat_uptr_t __user *envp,
1437
struct pt_regs * regs)
1439
struct linux_binprm *bprm;
1441
struct files_struct *displaced;
1445
retval = unshare_files(&displaced);
1450
bprm = kzalloc(sizeof(*bprm), GFP_KERNEL);
1454
retval = prepare_bprm_creds(bprm);
1458
retval = check_unsafe_exec(bprm);
1461
clear_in_exec = retval;
1462
current->in_execve = 1;
1464
file = open_exec(filename);
1465
retval = PTR_ERR(file);
1472
bprm->filename = filename;
1473
bprm->interp = filename;
1475
retval = bprm_mm_init(bprm);
1479
bprm->argc = compat_count(argv, MAX_ARG_STRINGS);
1480
if ((retval = bprm->argc) < 0)
1483
bprm->envc = compat_count(envp, MAX_ARG_STRINGS);
1484
if ((retval = bprm->envc) < 0)
1487
retval = prepare_binprm(bprm);
1491
retval = copy_strings_kernel(1, &bprm->filename, bprm);
1495
bprm->exec = bprm->p;
1496
retval = compat_copy_strings(bprm->envc, envp, bprm);
1500
retval = compat_copy_strings(bprm->argc, argv, bprm);
1504
retval = search_binary_handler(bprm, regs);
1508
/* execve succeeded */
1509
current->fs->in_exec = 0;
1510
current->in_execve = 0;
1511
acct_update_integrals(current);
1514
put_files_struct(displaced);
1519
acct_arg_size(bprm, 0);
1525
allow_write_access(bprm->file);
1531
current->fs->in_exec = 0;
1532
current->in_execve = 0;
1539
reset_files_struct(displaced);
1544
1309
#define __COMPAT_NFDBITS (8 * sizeof(compat_ulong_t))
1546
1311
static int poll_select_copy_remaining(struct timespec *end_time, void __user *p,