Code Review
/
kvmfornfv.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
review
|
tree
raw
|
inline
| side by side
Updating documents of D-release.
[kvmfornfv.git]
/
kernel
/
fs
/
overlayfs
/
inode.c
diff --git
a/kernel/fs/overlayfs/inode.c
b/kernel/fs/overlayfs/inode.c
index
05ac9a9
..
220b04f
100644
(file)
--- a/
kernel/fs/overlayfs/inode.c
+++ b/
kernel/fs/overlayfs/inode.c
@@
-63,6
+63,9
@@
int ovl_setattr(struct dentry *dentry, struct iattr *attr)
if (!err) {
upperdentry = ovl_dentry_upper(dentry);
if (!err) {
upperdentry = ovl_dentry_upper(dentry);
+ if (attr->ia_valid & (ATTR_KILL_SUID|ATTR_KILL_SGID))
+ attr->ia_valid &= ~ATTR_MODE;
+
mutex_lock(&upperdentry->d_inode->i_mutex);
err = notify_change(upperdentry, attr, NULL);
if (!err)
mutex_lock(&upperdentry->d_inode->i_mutex);
err = notify_change(upperdentry, attr, NULL);
if (!err)
@@
-216,7
+219,7
@@
static int ovl_readlink(struct dentry *dentry, char __user *buf, int bufsiz)
}
}
-
static
bool ovl_is_private_xattr(const char *name)
+bool ovl_is_private_xattr(const char *name)
{
return strncmp(name, OVL_XATTR_PRE_NAME, OVL_XATTR_PRE_LEN) == 0;
}
{
return strncmp(name, OVL_XATTR_PRE_NAME, OVL_XATTR_PRE_LEN) == 0;
}
@@
-274,7
+277,8
@@
ssize_t ovl_listxattr(struct dentry *dentry, char *list, size_t size)
struct path realpath;
enum ovl_path_type type = ovl_path_real(dentry, &realpath);
ssize_t res;
struct path realpath;
enum ovl_path_type type = ovl_path_real(dentry, &realpath);
ssize_t res;
- int off;
+ size_t len;
+ char *s;
res = vfs_listxattr(realpath.dentry, list, size);
if (res <= 0 || size == 0)
res = vfs_listxattr(realpath.dentry, list, size);
if (res <= 0 || size == 0)
@@
-284,17
+288,19
@@
ssize_t ovl_listxattr(struct dentry *dentry, char *list, size_t size)
return res;
/* filter out private xattrs */
return res;
/* filter out private xattrs */
- for (off = 0; off < res;) {
- char *s = list + off;
- size_t slen = strlen(s) + 1;
+ for (s = list, len = res; len;) {
+ size_t slen = strnlen(s, len) + 1;
- BUG_ON(off + slen > res);
+ /* underlying fs providing us with an broken xattr list? */
+ if (WARN_ON(slen > len))
+ return -EIO;
+ len -= slen;
if (ovl_is_private_xattr(s)) {
res -= slen;
if (ovl_is_private_xattr(s)) {
res -= slen;
- memmove(s, s + slen,
res - off
);
+ memmove(s, s + slen,
len
);
} else {
} else {
-
off
+= slen;
+
s
+= slen;
}
}
}
}
@@
-412,12
+418,11
@@
struct inode *ovl_new_inode(struct super_block *sb, umode_t mode,
if (!inode)
return NULL;
if (!inode)
return NULL;
- mode &= S_IFMT;
-
inode->i_ino = get_next_ino();
inode->i_mode = mode;
inode->i_flags |= S_NOATIME | S_NOCMTIME;
inode->i_ino = get_next_ino();
inode->i_mode = mode;
inode->i_flags |= S_NOATIME | S_NOCMTIME;
+ mode &= S_IFMT;
switch (mode) {
case S_IFDIR:
inode->i_private = oe;
switch (mode) {
case S_IFDIR:
inode->i_private = oe;