264
263
asmlinkage long compat_sys_statfs(const char __user *pathname, struct compat_statfs __user *buf)
269
error = user_path(pathname, &path);
272
error = vfs_statfs(&path, &tmp);
274
error = put_compat_statfs(buf, &tmp);
266
int error = user_statfs(pathname, &tmp);
268
error = put_compat_statfs(buf, &tmp);
280
272
asmlinkage long compat_sys_fstatfs(unsigned int fd, struct compat_statfs __user *buf)
283
274
struct kstatfs tmp;
290
error = vfs_statfs(&file->f_path, &tmp);
275
int error = fd_statfs(fd, &tmp);
292
277
error = put_compat_statfs(buf, &tmp);
331
314
asmlinkage long compat_sys_statfs64(const char __user *pathname, compat_size_t sz, struct compat_statfs64 __user *buf)
336
319
if (sz != sizeof(*buf))
339
error = user_path(pathname, &path);
342
error = vfs_statfs(&path, &tmp);
344
error = put_compat_statfs64(buf, &tmp);
322
error = user_statfs(pathname, &tmp);
324
error = put_compat_statfs64(buf, &tmp);
350
328
asmlinkage long compat_sys_fstatfs64(unsigned int fd, compat_size_t sz, struct compat_statfs64 __user *buf)
353
330
struct kstatfs tmp;
356
333
if (sz != sizeof(*buf))
363
error = vfs_statfs(&file->f_path, &tmp);
336
error = fd_statfs(fd, &tmp);
365
338
error = put_compat_statfs64(buf, &tmp);
1335
1306
return do_sys_open(dfd, filename, flags, mode);
1339
* compat_count() counts the number of arguments/envelopes. It is basically
1340
* a copy of count() from fs/exec.c, except that it works with 32 bit argv
1341
* and envp pointers.
1343
static int compat_count(compat_uptr_t __user *argv, int max)
1351
if (get_user(p, argv))
1359
if (fatal_signal_pending(current))
1360
return -ERESTARTNOHAND;
1368
* compat_copy_strings() is basically a copy of copy_strings() from fs/exec.c
1369
* except that it works with 32 bit argv and envp pointers.
1371
static int compat_copy_strings(int argc, compat_uptr_t __user *argv,
1372
struct linux_binprm *bprm)
1374
struct page *kmapped_page = NULL;
1376
unsigned long kpos = 0;
1379
while (argc-- > 0) {
1384
if (get_user(str, argv+argc) ||
1385
!(len = strnlen_user(compat_ptr(str), MAX_ARG_STRLEN))) {
1390
if (len > MAX_ARG_STRLEN) {
1395
/* We're going to work our way backwords. */
1401
int offset, bytes_to_copy;
1403
if (fatal_signal_pending(current)) {
1404
ret = -ERESTARTNOHAND;
1409
offset = pos % PAGE_SIZE;
1413
bytes_to_copy = offset;
1414
if (bytes_to_copy > len)
1415
bytes_to_copy = len;
1417
offset -= bytes_to_copy;
1418
pos -= bytes_to_copy;
1419
str -= bytes_to_copy;
1420
len -= bytes_to_copy;
1422
if (!kmapped_page || kpos != (pos & PAGE_MASK)) {
1425
page = get_arg_page(bprm, pos, 1);
1432
flush_kernel_dcache_page(kmapped_page);
1433
kunmap(kmapped_page);
1434
put_page(kmapped_page);
1436
kmapped_page = page;
1437
kaddr = kmap(kmapped_page);
1438
kpos = pos & PAGE_MASK;
1439
flush_cache_page(bprm->vma, kpos,
1440
page_to_pfn(kmapped_page));
1442
if (copy_from_user(kaddr+offset, compat_ptr(str),
1452
flush_kernel_dcache_page(kmapped_page);
1453
kunmap(kmapped_page);
1454
put_page(kmapped_page);
1460
* compat_do_execve() is mostly a copy of do_execve(), with the exception
1461
* that it processes 32 bit argv and envp pointers.
1463
int compat_do_execve(char * filename,
1464
compat_uptr_t __user *argv,
1465
compat_uptr_t __user *envp,
1466
struct pt_regs * regs)
1468
struct linux_binprm *bprm;
1470
struct files_struct *displaced;
1474
retval = unshare_files(&displaced);
1479
bprm = kzalloc(sizeof(*bprm), GFP_KERNEL);
1483
retval = prepare_bprm_creds(bprm);
1487
retval = check_unsafe_exec(bprm);
1490
clear_in_exec = retval;
1491
current->in_execve = 1;
1493
file = open_exec(filename);
1494
retval = PTR_ERR(file);
1501
bprm->filename = filename;
1502
bprm->interp = filename;
1504
retval = bprm_mm_init(bprm);
1508
bprm->argc = compat_count(argv, MAX_ARG_STRINGS);
1509
if ((retval = bprm->argc) < 0)
1512
bprm->envc = compat_count(envp, MAX_ARG_STRINGS);
1513
if ((retval = bprm->envc) < 0)
1516
retval = prepare_binprm(bprm);
1520
retval = copy_strings_kernel(1, &bprm->filename, bprm);
1524
bprm->exec = bprm->p;
1525
retval = compat_copy_strings(bprm->envc, envp, bprm);
1529
retval = compat_copy_strings(bprm->argc, argv, bprm);
1533
retval = search_binary_handler(bprm, regs);
1537
trace_fs_exec(filename);
1538
/* execve succeeded */
1539
current->fs->in_exec = 0;
1540
current->in_execve = 0;
1541
acct_update_integrals(current);
1544
put_files_struct(displaced);
1549
acct_arg_size(bprm, 0);
1555
allow_write_access(bprm->file);
1561
current->fs->in_exec = 0;
1562
current->in_execve = 0;
1569
reset_files_struct(displaced);
1574
1309
#define __COMPAT_NFDBITS (8 * sizeof(compat_ulong_t))
1576
1311
static int poll_select_copy_remaining(struct timespec *end_time, void __user *p,