HADOOP-12345. Pad hostname correctly in CredentialsSys.java. Contributed by Pradeep Nayak Udupi Kadbet.
(cherry picked from commit 846ada2de3
)
This commit is contained in:
parent
b7b5807d2c
commit
af581c0e23
|
@ -17,6 +17,7 @@
|
||||||
*/
|
*/
|
||||||
package org.apache.hadoop.oncrpc.security;
|
package org.apache.hadoop.oncrpc.security;
|
||||||
|
|
||||||
|
import com.google.common.annotations.VisibleForTesting;
|
||||||
import org.apache.commons.logging.Log;
|
import org.apache.commons.logging.Log;
|
||||||
import org.apache.commons.logging.LogFactory;
|
import org.apache.commons.logging.LogFactory;
|
||||||
import org.apache.hadoop.oncrpc.XDR;
|
import org.apache.hadoop.oncrpc.XDR;
|
||||||
|
@ -66,4 +67,9 @@ public abstract class Credentials extends RpcAuthInfo {
|
||||||
protected Credentials(AuthFlavor flavor) {
|
protected Credentials(AuthFlavor flavor) {
|
||||||
super(flavor);
|
super(flavor);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@VisibleForTesting
|
||||||
|
int getCredentialLength() {
|
||||||
|
return mCredentialsLength;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,6 +20,7 @@ package org.apache.hadoop.oncrpc.security;
|
||||||
import java.net.InetAddress;
|
import java.net.InetAddress;
|
||||||
import java.net.UnknownHostException;
|
import java.net.UnknownHostException;
|
||||||
|
|
||||||
|
import com.google.common.annotations.VisibleForTesting;
|
||||||
import org.apache.commons.io.Charsets;
|
import org.apache.commons.io.Charsets;
|
||||||
import org.apache.hadoop.oncrpc.XDR;
|
import org.apache.hadoop.oncrpc.XDR;
|
||||||
|
|
||||||
|
@ -63,6 +64,11 @@ public class CredentialsSys extends Credentials {
|
||||||
return mAuxGIDs;
|
return mAuxGIDs;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@VisibleForTesting
|
||||||
|
int getStamp() {
|
||||||
|
return mStamp;
|
||||||
|
}
|
||||||
|
|
||||||
public void setGID(int gid) {
|
public void setGID(int gid) {
|
||||||
this.mGID = gid;
|
this.mGID = gid;
|
||||||
}
|
}
|
||||||
|
@ -75,6 +81,11 @@ public class CredentialsSys extends Credentials {
|
||||||
this.mStamp = stamp;
|
this.mStamp = stamp;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@VisibleForTesting
|
||||||
|
void setHostName(String hostname) {
|
||||||
|
this.mHostName = hostname;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void read(XDR xdr) {
|
public void read(XDR xdr) {
|
||||||
mCredentialsLength = xdr.readInt();
|
mCredentialsLength = xdr.readInt();
|
||||||
|
@ -93,8 +104,14 @@ public class CredentialsSys extends Credentials {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void write(XDR xdr) {
|
public void write(XDR xdr) {
|
||||||
|
int padding = 0;
|
||||||
|
// Ensure there are padding bytes if hostname is not a multiple of 4.
|
||||||
|
padding = 4 - (mHostName.getBytes(Charsets.UTF_8).length % 4);
|
||||||
|
// padding bytes is zero if hostname is already a multiple of 4.
|
||||||
|
padding = padding % 4;
|
||||||
// mStamp + mHostName.length + mHostName + mUID + mGID + mAuxGIDs.count
|
// mStamp + mHostName.length + mHostName + mUID + mGID + mAuxGIDs.count
|
||||||
mCredentialsLength = 20 + mHostName.getBytes(Charsets.UTF_8).length;
|
mCredentialsLength = 20 + mHostName.getBytes(Charsets.UTF_8).length;
|
||||||
|
mCredentialsLength = mCredentialsLength + padding;
|
||||||
// mAuxGIDs
|
// mAuxGIDs
|
||||||
if (mAuxGIDs != null && mAuxGIDs.length > 0) {
|
if (mAuxGIDs != null && mAuxGIDs.length > 0) {
|
||||||
mCredentialsLength += mAuxGIDs.length * 4;
|
mCredentialsLength += mAuxGIDs.length * 4;
|
||||||
|
|
|
@ -33,6 +33,7 @@ public class TestCredentialsSys {
|
||||||
CredentialsSys credential = new CredentialsSys();
|
CredentialsSys credential = new CredentialsSys();
|
||||||
credential.setUID(0);
|
credential.setUID(0);
|
||||||
credential.setGID(1);
|
credential.setGID(1);
|
||||||
|
credential.setStamp(1234);
|
||||||
|
|
||||||
XDR xdr = new XDR();
|
XDR xdr = new XDR();
|
||||||
credential.write(xdr);
|
credential.write(xdr);
|
||||||
|
@ -42,5 +43,46 @@ public class TestCredentialsSys {
|
||||||
|
|
||||||
assertEquals(0, newCredential.getUID());
|
assertEquals(0, newCredential.getUID());
|
||||||
assertEquals(1, newCredential.getGID());
|
assertEquals(1, newCredential.getGID());
|
||||||
|
assertEquals(1234, newCredential.getStamp());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testHostNameNotMultipleOf4() {
|
||||||
|
CredentialsSys credential = new CredentialsSys();
|
||||||
|
credential.setUID(0);
|
||||||
|
credential.setGID(1);
|
||||||
|
credential.setStamp(1234);
|
||||||
|
credential.setHostName("hadoop-nfs");
|
||||||
|
|
||||||
|
XDR xdr = new XDR();
|
||||||
|
credential.write(xdr);
|
||||||
|
|
||||||
|
CredentialsSys newCredential = new CredentialsSys();
|
||||||
|
newCredential.read(xdr.asReadOnlyWrap());
|
||||||
|
|
||||||
|
assertEquals(0, newCredential.getUID());
|
||||||
|
assertEquals(1, newCredential.getGID());
|
||||||
|
assertEquals(1234, newCredential.getStamp());
|
||||||
|
assertEquals(32, newCredential.getCredentialLength());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testHostNameMultipleOf4() {
|
||||||
|
CredentialsSys credential = new CredentialsSys();
|
||||||
|
credential.setUID(0);
|
||||||
|
credential.setGID(1);
|
||||||
|
credential.setStamp(1234);
|
||||||
|
credential.setHostName("apachehadoop");
|
||||||
|
|
||||||
|
XDR xdr = new XDR();
|
||||||
|
credential.write(xdr);
|
||||||
|
|
||||||
|
CredentialsSys newCredential = new CredentialsSys();
|
||||||
|
newCredential.read(xdr.asReadOnlyWrap());
|
||||||
|
|
||||||
|
assertEquals(0, newCredential.getUID());
|
||||||
|
assertEquals(1, newCredential.getGID());
|
||||||
|
assertEquals(1234, newCredential.getStamp());
|
||||||
|
assertEquals(32, newCredential.getCredentialLength());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue