HDFS-6361. TestIdUserGroup.testUserUpdateSetting failed due to out of range nfsnobody Id. Contributed by Yongjun Zhang
git-svn-id: https://svn.apache.org/repos/asf/hadoop/common/trunk@1595050 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
046ad2e40e
commit
1c0e7a318e
@ -114,6 +114,22 @@ private static void reportDuplicateEntry(final String header,
|
|||||||
DUPLICATE_NAME_ID_DEBUG_INFO));
|
DUPLICATE_NAME_ID_DEBUG_INFO));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* uid and gid are defined as uint32 in linux. Some systems create
|
||||||
|
* (intended or unintended) <nfsnobody, 4294967294> kind of <name,Id>
|
||||||
|
* mapping, where 4294967294 is 2**32-2 as unsigned int32. As an example,
|
||||||
|
* https://bugzilla.redhat.com/show_bug.cgi?id=511876.
|
||||||
|
* Because user or group id are treated as Integer (signed integer or int32)
|
||||||
|
* here, the number 4294967294 is out of range. The solution is to convert
|
||||||
|
* uint32 to int32, so to map the out-of-range ID to the negative side of
|
||||||
|
* Integer, e.g. 4294967294 maps to -2 and 4294967295 maps to -1.
|
||||||
|
*/
|
||||||
|
private static Integer parseId(final String idStr) {
|
||||||
|
Long longVal = Long.parseLong(idStr);
|
||||||
|
int intVal = longVal.intValue();
|
||||||
|
return Integer.valueOf(intVal);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the whole list of users and groups and save them in the maps.
|
* Get the whole list of users and groups and save them in the maps.
|
||||||
* @throws IOException
|
* @throws IOException
|
||||||
@ -134,7 +150,7 @@ public static void updateMapInternal(BiMap<Integer, String> map, String mapName,
|
|||||||
}
|
}
|
||||||
LOG.debug("add to " + mapName + "map:" + nameId[0] + " id:" + nameId[1]);
|
LOG.debug("add to " + mapName + "map:" + nameId[0] + " id:" + nameId[1]);
|
||||||
// HDFS can't differentiate duplicate names with simple authentication
|
// HDFS can't differentiate duplicate names with simple authentication
|
||||||
final Integer key = Integer.valueOf(nameId[1]);
|
final Integer key = parseId(nameId[1]);
|
||||||
final String value = nameId[0];
|
final String value = nameId[0];
|
||||||
if (map.containsKey(key)) {
|
if (map.containsKey(key)) {
|
||||||
final String prevValue = map.get(key);
|
final String prevValue = map.get(key);
|
||||||
|
@ -66,6 +66,51 @@ public void testDuplicates() throws IOException {
|
|||||||
assertEquals("mapred3", gMap.get(498));
|
assertEquals("mapred3", gMap.get(498));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testIdOutOfIntegerRange() throws IOException {
|
||||||
|
String GET_ALL_USERS_CMD = "echo \""
|
||||||
|
+ "nfsnobody:x:4294967294:4294967294:Anonymous NFS User:/var/lib/nfs:/sbin/nologin\n"
|
||||||
|
+ "nfsnobody1:x:4294967295:4294967295:Anonymous NFS User:/var/lib/nfs1:/sbin/nologin\n"
|
||||||
|
+ "maxint:x:2147483647:2147483647:Grid Distributed File System:/home/maxint:/bin/bash\n"
|
||||||
|
+ "minint:x:2147483648:2147483648:Grid Distributed File System:/home/minint:/bin/bash\n"
|
||||||
|
+ "archivebackup:*:1031:4294967294:Archive Backup:/home/users/archivebackup:/bin/sh\n"
|
||||||
|
+ "hdfs:x:11501:10787:Grid Distributed File System:/home/hdfs:/bin/bash\n"
|
||||||
|
+ "daemon:x:2:2:daemon:/sbin:/sbin/nologin\""
|
||||||
|
+ " | cut -d: -f1,3";
|
||||||
|
String GET_ALL_GROUPS_CMD = "echo \""
|
||||||
|
+ "hdfs:*:11501:hrt_hdfs\n"
|
||||||
|
+ "rpcuser:*:29:\n"
|
||||||
|
+ "nfsnobody:*:4294967294:\n"
|
||||||
|
+ "nfsnobody1:*:4294967295:\n"
|
||||||
|
+ "maxint:*:2147483647:\n"
|
||||||
|
+ "minint:*:2147483648:\n"
|
||||||
|
+ "mapred3:x:498\""
|
||||||
|
+ " | cut -d: -f1,3";
|
||||||
|
// Maps for id to name map
|
||||||
|
BiMap<Integer, String> uMap = HashBiMap.create();
|
||||||
|
BiMap<Integer, String> gMap = HashBiMap.create();
|
||||||
|
|
||||||
|
IdUserGroup.updateMapInternal(uMap, "user", GET_ALL_USERS_CMD, ":");
|
||||||
|
assertTrue(uMap.size() == 7);
|
||||||
|
assertEquals("nfsnobody", uMap.get(-2));
|
||||||
|
assertEquals("nfsnobody1", uMap.get(-1));
|
||||||
|
assertEquals("maxint", uMap.get(2147483647));
|
||||||
|
assertEquals("minint", uMap.get(-2147483648));
|
||||||
|
assertEquals("archivebackup", uMap.get(1031));
|
||||||
|
assertEquals("hdfs",uMap.get(11501));
|
||||||
|
assertEquals("daemon", uMap.get(2));
|
||||||
|
|
||||||
|
IdUserGroup.updateMapInternal(gMap, "group", GET_ALL_GROUPS_CMD, ":");
|
||||||
|
assertTrue(gMap.size() == 7);
|
||||||
|
assertEquals("hdfs",gMap.get(11501));
|
||||||
|
assertEquals("rpcuser", gMap.get(29));
|
||||||
|
assertEquals("nfsnobody", gMap.get(-2));
|
||||||
|
assertEquals("nfsnobody1", gMap.get(-1));
|
||||||
|
assertEquals("maxint", gMap.get(2147483647));
|
||||||
|
assertEquals("minint", gMap.get(-2147483648));
|
||||||
|
assertEquals("mapred3", gMap.get(498));
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testUserUpdateSetting() throws IOException {
|
public void testUserUpdateSetting() throws IOException {
|
||||||
IdUserGroup iug = new IdUserGroup();
|
IdUserGroup iug = new IdUserGroup();
|
||||||
|
@ -551,6 +551,9 @@ Release 2.4.1 - UNRELEASED
|
|||||||
|
|
||||||
HDFS-6326. WebHdfs ACL compatibility is broken. (cnauroth)
|
HDFS-6326. WebHdfs ACL compatibility is broken. (cnauroth)
|
||||||
|
|
||||||
|
HDFS-6361. TestIdUserGroup.testUserUpdateSetting failed due to out of range
|
||||||
|
nfsnobody Id. (Yongjun Zhang via brandonli)
|
||||||
|
|
||||||
Release 2.4.0 - 2014-04-07
|
Release 2.4.0 - 2014-04-07
|
||||||
|
|
||||||
INCOMPATIBLE CHANGES
|
INCOMPATIBLE CHANGES
|
||||||
|
Loading…
Reference in New Issue
Block a user