HADOOP-10087. UserGroupInformation.getGroupNames() fails to return primary group first when JniBasedUnixGroupsMappingWithFallback is used (cmccabe)
git-svn-id: https://svn.apache.org/repos/asf/hadoop/common/branches/branch-2@1550230 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
dd09c71894
commit
8e416ea685
|
@ -247,6 +247,9 @@ Release 2.3.0 - UNRELEASED
|
||||||
HADOOP-10081. Client.setupIOStreams can leak socket resources on exception
|
HADOOP-10081. Client.setupIOStreams can leak socket resources on exception
|
||||||
or error (Tsuyoshi OZAWA via jlowe)
|
or error (Tsuyoshi OZAWA via jlowe)
|
||||||
|
|
||||||
|
HADOOP-10087. UserGroupInformation.getGroupNames() fails to return primary
|
||||||
|
group first when JniBasedUnixGroupsMappingWithFallback is used (cmccabe)
|
||||||
|
|
||||||
Release 2.2.0 - 2013-10-13
|
Release 2.2.0 - 2013-10-13
|
||||||
|
|
||||||
INCOMPATIBLE CHANGES
|
INCOMPATIBLE CHANGES
|
||||||
|
|
|
@ -122,13 +122,43 @@ int hadoop_user_info_fetch(struct hadoop_user_info *uinfo,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int put_primary_gid_first(struct hadoop_user_info *uinfo)
|
||||||
|
{
|
||||||
|
int i, num_gids = uinfo->num_gids;
|
||||||
|
gid_t first_gid;
|
||||||
|
gid_t gid;
|
||||||
|
gid_t primary = uinfo->pwd.pw_gid;
|
||||||
|
|
||||||
|
if (num_gids < 1) {
|
||||||
|
// There are no gids, but we expected at least one.
|
||||||
|
return EINVAL;
|
||||||
|
}
|
||||||
|
first_gid = uinfo->gids[0];
|
||||||
|
if (first_gid == primary) {
|
||||||
|
// First gid is already the primary.
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
for (i = 1; i < num_gids; i++) {
|
||||||
|
gid = uinfo->gids[i];
|
||||||
|
if (gid == primary) {
|
||||||
|
// swap first gid and this gid.
|
||||||
|
uinfo->gids[0] = gid;
|
||||||
|
uinfo->gids[i] = first_gid;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Did not find the primary gid in the list.
|
||||||
|
return EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
int hadoop_user_info_getgroups(struct hadoop_user_info *uinfo)
|
int hadoop_user_info_getgroups(struct hadoop_user_info *uinfo)
|
||||||
{
|
{
|
||||||
int ret, ngroups;
|
int ret, ngroups;
|
||||||
gid_t *ngids;
|
gid_t *ngids;
|
||||||
|
|
||||||
if (!uinfo->pwd.pw_name) {
|
if (!uinfo->pwd.pw_name) {
|
||||||
return EINVAL; // invalid user info
|
// invalid user info
|
||||||
|
return EINVAL;
|
||||||
}
|
}
|
||||||
uinfo->num_gids = 0;
|
uinfo->num_gids = 0;
|
||||||
if (!uinfo->gids) {
|
if (!uinfo->gids) {
|
||||||
|
@ -141,8 +171,12 @@ int hadoop_user_info_getgroups(struct hadoop_user_info *uinfo)
|
||||||
ngroups = uinfo->gids_size;
|
ngroups = uinfo->gids_size;
|
||||||
ret = getgrouplist(uinfo->pwd.pw_name, uinfo->pwd.pw_gid,
|
ret = getgrouplist(uinfo->pwd.pw_name, uinfo->pwd.pw_gid,
|
||||||
uinfo->gids, &ngroups);
|
uinfo->gids, &ngroups);
|
||||||
if (ret != -1) {
|
if (ret > 0) {
|
||||||
uinfo->num_gids = ngroups;
|
uinfo->num_gids = ngroups;
|
||||||
|
ret = put_primary_gid_first(uinfo);
|
||||||
|
if (ret) {
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
ngids = realloc(uinfo->gids, sizeof(uinfo->gids[0]) * ngroups);
|
ngids = realloc(uinfo->gids, sizeof(uinfo->gids[0]) * ngroups);
|
||||||
|
@ -153,11 +187,12 @@ int hadoop_user_info_getgroups(struct hadoop_user_info *uinfo)
|
||||||
uinfo->gids_size = ngroups;
|
uinfo->gids_size = ngroups;
|
||||||
ret = getgrouplist(uinfo->pwd.pw_name, uinfo->pwd.pw_gid,
|
ret = getgrouplist(uinfo->pwd.pw_name, uinfo->pwd.pw_gid,
|
||||||
uinfo->gids, &ngroups);
|
uinfo->gids, &ngroups);
|
||||||
if (ret != -1) {
|
if (ret < 0) {
|
||||||
uinfo->num_gids = ngroups;
|
return EIO;
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
return EIO;
|
uinfo->num_gids = ngroups;
|
||||||
|
ret = put_primary_gid_first(uinfo);
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef USER_TESTING
|
#ifdef USER_TESTING
|
||||||
|
|
Loading…
Reference in New Issue