Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- diff -Nru prl_fs.orig/SharedFolders/Guest/Linux/prl_fs/inode.c prl_fs/SharedFolders/Guest/Linux/prl_fs/inode.c
- --- prl_fs.orig/SharedFolders/Guest/Linux/prl_fs/inode.c 2013-11-11 17:56:58.000000000 +0200
- +++ prl_fs/SharedFolders/Guest/Linux/prl_fs/inode.c 2013-11-29 20:41:53.689167040 +0200
- @@ -199,10 +199,18 @@
- if (attr->valid & _PATTR_MODE)
- inode->i_mode = (inode->i_mode & S_IFMT) | (attr->mode & 0777);
- if ((attr->valid & _PATTR_UID) &&
- - (sbi->plain || sbi->share || attr->uid == -1))
- +#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,5,0)
- + (sbi->plain || sbi->share || __kuid_val(attr->uid) == -1))
- +#else
- + (sbi->plain || sbi->share || attr->uid == -1)))
- +#endif
- inode->i_uid = attr->uid;
- if ((attr->valid & _PATTR_GID) &&
- - (sbi->plain || sbi->share || attr->gid == -1))
- +#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,5,0)
- + (sbi->plain || sbi->share || __kgid_val(attr->gid) == -1))
- +#else
- + (sbi->plain || sbi->share || attr->gid == -1)))
- +#endif
- inode->i_gid = attr->gid;
- return;
- }
- @@ -521,13 +529,21 @@
- generic_fillattr(dentry->d_inode, stat);
- if (PRLFS_SB(dentry->d_sb)->share) {
- +#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,5,0)
- + if (__kuid_val(stat->uid) != -1)
- +#else
- if (stat->uid != -1)
- +#endif
- #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,29)
- stat->uid = current->fsuid;
- #else
- stat->uid = current->cred->fsuid;
- #endif
- +#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,5,0)
- + if (__kgid_val(stat->gid) != -1)
- +#else
- if (stat->gid != -1)
- +#endif
- #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,29)
- stat->gid = current->fsgid;
- #else
- @@ -577,9 +593,17 @@
- mode = inode->i_mode;
- isdir = S_ISDIR(mode);
- +#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,5,0)
- + if (__kuid_val(inode->i_uid) != -1)
- +#else
- if (inode->i_uid != -1)
- +#endif
- mode = mode >> 6;
- +#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,5,0)
- + else if (__kgid_val(inode->i_gid) != -1)
- +#else
- else if (inode->i_gid != -1)
- +#endif
- mode = mode >> 3;
- mode &= 0007;
- mask &= MAY_READ | MAY_WRITE | MAY_EXEC;
- diff -Nru prl_fs.orig/SharedFolders/Guest/Linux/prl_fs/prlfs.h prl_fs/SharedFolders/Guest/Linux/prl_fs/prlfs.h
- --- prl_fs.orig/SharedFolders/Guest/Linux/prl_fs/prlfs.h 2013-11-11 17:56:58.000000000 +0200
- +++ prl_fs/SharedFolders/Guest/Linux/prl_fs/prlfs.h 2013-11-29 20:46:27.662771996 +0200
- @@ -28,8 +28,13 @@
- struct pci_dev *pdev;
- unsigned sfid;
- unsigned ttl;
- +#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,5,0)
- + kuid_t uid;
- + kgid_t gid;
- +#else
- uid_t uid;
- gid_t gid;
- +#endif
- int readonly;
- int share;
- int plain;
- diff -Nru prl_fs.orig/SharedFolders/Guest/Linux/prl_fs/super.c prl_fs/SharedFolders/Guest/Linux/prl_fs/super.c
- --- prl_fs.orig/SharedFolders/Guest/Linux/prl_fs/super.c 2013-11-11 17:56:58.000000000 +0200
- +++ prl_fs/SharedFolders/Guest/Linux/prl_fs/super.c 2013-11-29 20:28:39.212000000 +0200
- @@ -13,6 +13,7 @@
- #include <linux/seq_file.h>
- #include <linux/ctype.h>
- #include <linux/vfs.h>
- +#include <linux/parser.h>
- #include "prlfs.h"
- #include "prlfs_compat.h"
- @@ -26,38 +27,35 @@
- extern struct file_operations prlfs_names_fops;
- extern struct inode_operations prlfs_names_iops;
- -static int prlfs_strtoui(char *cp, unsigned *result){
- - int ret = 0;
- - unsigned ui = 0;
- - unsigned digit;
- -
- - if (!cp || (*cp == 0))
- - return -EINVAL;
- -
- - while (*cp) {
- - if (isdigit(*cp)) {
- - digit = *cp - '0';
- - } else {
- - ret = -EINVAL;
- - break;
- - }
- - if (ui > ui * 10U + digit)
- - return -EINVAL;
- - ui = ui * 10U + digit;
- - cp++;
- - }
- -
- - if (ret == 0)
- - *result = ui;
- -
- - return ret;
- -}
- +enum {
- + Opt_uid,
- + Opt_gid,
- + Opt_ttl,
- + Opt_nls,
- + Opt_share,
- + Opt_plain,
- + Opt_sf,
- + Opt_err,
- +};
- +
- +static const match_table_t prlfs_tokens = {
- + {Opt_uid, "uid=%d"},
- + {Opt_gid, "gid=%d"},
- + {Opt_ttl, "ttl=%u"},
- + {Opt_nls, "nls=%s"},
- + {Opt_share, "share"},
- + {Opt_plain, "plain"},
- + {Opt_sf, "sf=%s"},
- + {Opt_err, NULL}
- +};
- static int
- prlfs_parse_mount_options(char *options, struct prlfs_sb_info *sbi)
- {
- + substring_t args[MAX_OPT_ARGS];
- int ret = 0;
- - char *opt, *val;
- + int val;
- + char *opt;
- DPRINTK("ENTER\n");
- #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,29)
- @@ -70,35 +68,54 @@
- sbi->ttl = HZ;
- if (!options)
- - goto out;
- + goto out;
- - while (!ret && (opt = strsep(&options, ",")) != NULL)
- + while (!ret && ((opt = strsep(&options, ",")) != NULL))
- {
- + int token;
- if (!*opt)
- continue;
- - val = strchr(opt, '=');
- - if (val) {
- - *(val++) = 0;
- - if (strlen(val) == 0)
- - val = NULL;
- - }
- - if (!strcmp(opt, "ttl") && val)
- - ret = prlfs_strtoui(val, &sbi->ttl);
- - else if (!strcmp(opt, "uid") && val)
- - ret = prlfs_strtoui(val, &sbi->uid);
- - else if (!strcmp(opt, "gid") && val)
- - ret = prlfs_strtoui(val, &sbi->gid);
- - else if (!strcmp(opt, "nls") && val)
- - strncpy(sbi->nls, val, LOCALE_NAME_LEN - 1);
- - else if (!strcmp(opt, "share"))
- + token = match_token(opt, prlfs_tokens, args);
- + switch (token) {
- + case Opt_uid:
- + if (!(ret = match_int(&args[0], &val)))
- +#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,5,0)
- + sbi->uid = KUIDT_INIT(val);
- +#else
- + sbi->uid = val;
- +#endif
- + break;
- + case Opt_gid:
- + if (!(ret = match_int(&args[0], &val)))
- +#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,5,0)
- + sbi->gid = KGIDT_INIT(val);
- +#else
- + sbi->gid = val;
- +#endif
- + break;
- + case Opt_ttl:
- + if (!(ret = match_int(&args[0], &val)))
- + sbi->ttl = val;
- + break;
- + case Opt_nls:
- + if (!match_strlcpy(sbi->nls, &args[0], LOCALE_NAME_LEN - 1))
- + ret = -EINVAL;
- + break;
- + case Opt_share:
- sbi->share = 1;
- - else if (!strcmp(opt, "plain"))
- + break;
- + case Opt_plain:
- sbi->plain = 1;
- - else if (!strcmp(opt, "sf") && val)
- - strncpy(sbi->name, val, sizeof(sbi->name));
- - else
- + break;
- + case Opt_sf:
- + if (!match_strlcpy(sbi->name, &args[0], sizeof(sbi->name)))
- + ret = -EINVAL;
- + break;
- + default:
- ret = -EINVAL;
- + }
- + DPRINTK("PARSE interating %d:%d:%s\n", token, val, args[0]);
- }
- out:
- DPRINTK("EXIT returning %d\n", ret);
- diff -Nru prl_fs.orig/SharedFolders/Interfaces/sf_lin.h prl_fs/SharedFolders/Interfaces/sf_lin.h
- --- prl_fs.orig/SharedFolders/Interfaces/sf_lin.h 2013-11-11 18:11:49.000000000 +0200
- +++ prl_fs/SharedFolders/Interfaces/sf_lin.h 2013-11-29 03:11:48.924415600 +0200
- @@ -40,8 +40,13 @@
- unsigned long long mtime;
- unsigned long long ctime;
- unsigned int mode;
- - unsigned int uid;
- - unsigned int gid;
- +#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,5,0)
- + kuid_t uid;
- + kgid_t gid;
- +#else
- + uid_t uid;
- + gid_t gid;
- +#endif
- unsigned int valid;
- } PACKED;
- SFLIN_CHECK_SIZE(prlfs_attr, sizeof(struct prlfs_attr), 48)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement