diff options
author | Eric W. Biederman <ebiederm@xmission.com> | 2012-03-03 22:52:01 -0500 |
---|---|---|
committer | Eric W. Biederman <ebiederm@xmission.com> | 2012-05-03 06:29:34 -0400 |
commit | 52137abe1820196d956bfd51edebc571b3427deb (patch) | |
tree | 29a06b63fa36d6b794f7b848e4a65eea1fb74f0f /fs/open.c | |
parent | 8e96e3b7b8407be794ab1fd8e4b332818a358e78 (diff) |
userns: Convert user specfied uids and gids in chown into kuids and kgid
Acked-by: Serge Hallyn <serge.hallyn@canonical.com>
Signed-off-by: Eric W. Biederman <ebiederm@xmission.com>
Diffstat (limited to 'fs/open.c')
-rw-r--r-- | fs/open.c | 13 |
1 files changed, 11 insertions, 2 deletions
@@ -506,15 +506,24 @@ static int chown_common(struct path *path, uid_t user, gid_t group) | |||
506 | struct inode *inode = path->dentry->d_inode; | 506 | struct inode *inode = path->dentry->d_inode; |
507 | int error; | 507 | int error; |
508 | struct iattr newattrs; | 508 | struct iattr newattrs; |
509 | kuid_t uid; | ||
510 | kgid_t gid; | ||
511 | |||
512 | uid = make_kuid(current_user_ns(), user); | ||
513 | gid = make_kgid(current_user_ns(), group); | ||
509 | 514 | ||
510 | newattrs.ia_valid = ATTR_CTIME; | 515 | newattrs.ia_valid = ATTR_CTIME; |
511 | if (user != (uid_t) -1) { | 516 | if (user != (uid_t) -1) { |
517 | if (!uid_valid(uid)) | ||
518 | return -EINVAL; | ||
512 | newattrs.ia_valid |= ATTR_UID; | 519 | newattrs.ia_valid |= ATTR_UID; |
513 | newattrs.ia_uid = user; | 520 | newattrs.ia_uid = uid; |
514 | } | 521 | } |
515 | if (group != (gid_t) -1) { | 522 | if (group != (gid_t) -1) { |
523 | if (!gid_valid(gid)) | ||
524 | return -EINVAL; | ||
516 | newattrs.ia_valid |= ATTR_GID; | 525 | newattrs.ia_valid |= ATTR_GID; |
517 | newattrs.ia_gid = group; | 526 | newattrs.ia_gid = gid; |
518 | } | 527 | } |
519 | if (!S_ISDIR(inode->i_mode)) | 528 | if (!S_ISDIR(inode->i_mode)) |
520 | newattrs.ia_valid |= | 529 | newattrs.ia_valid |= |