COMPAT_SYSCALL_DEFINE5(mount, const char __user *, dev_name, const char __user *, dir_name, const char __user *, type, compat_ulong_t, flags, const void __user *, data) { char *kernel_type; void *options; char *kernel_dev; int retval; kernel_type = copy_mount_string(type); retval = PTR_ERR(kernel_type); if (IS_ERR(kernel_type)) goto out; kernel_dev = copy_mount_string(dev_name); retval = PTR_ERR(kernel_dev); if (IS_ERR(kernel_dev)) goto out1; options = copy_mount_options(data); retval = PTR_ERR(options); if (IS_ERR(options)) goto out2; if (kernel_type && options) { if (!strcmp(kernel_type, NCPFS_NAME)) { do_ncp_super_data_conv(options); } else if (!strcmp(kernel_type, NFS4_NAME)) { retval = -EINVAL; if (do_nfs4_super_data_conv(options)) goto out3; } } retval = do_mount(kernel_dev, dir_name, kernel_type, flags, options); out3: kfree(options); out2: kfree(kernel_dev); out1: kfree(kernel_type); out: return retval; }
asmlinkage long jprobe_sys_mount_handler(char __user *dev_name, char __user *dir_name, char __user *type, unsigned long flags, void __user *data) { int ret = 0; char *kernel_type; char *kernel_dir; char *kernel_dev; unsigned long data_page; ret = copy_mount_string(type, &kernel_type); if (ret < 0) goto out_type; ret = copy_mount_string(dir_name, &kernel_dir); if (ret < 0) goto out_dir; ret = copy_mount_string(dev_name, &kernel_dev); if (ret < 0) goto out_dev; ret = copy_mount_options(data, &data_page); if (ret < 0) goto out_data; printk(KERN_INFO "%s() sys_mount(dev=%s, dir=%s, type=%s, flags=%lu)", __func__, kernel_dev, kernel_dir, kernel_type, flags); free_page(data_page); out_data: kfree(kernel_dev); out_dev: kfree(kernel_dir); out_dir: kfree(kernel_type); out_type: jprobe_return(); }