7190254: NetworkInterface getFlags implementation should support full integer bit range for flags value

Reviewed-by: chegar
This commit is contained in:
Shirish Kuncolienkar 2012-08-13 13:41:23 +01:00 committed by Chris Hegarty
parent f349c3da24
commit 492ac282bf

View File

@ -147,7 +147,7 @@ static struct sockaddr *getBroadcast(JNIEnv *env, int sock, const char *name, s
static short getSubnet(JNIEnv *env, int sock, const char *ifname);
static int getIndex(int sock, const char *ifname);
static int getFlags(int sock, const char *ifname);
static int getFlags(int sock, const char *ifname, int *flags);
static int getMacAddress(JNIEnv *env, int sock, const char* ifname, const struct in_addr* addr, unsigned char *buf);
static int getMTU(JNIEnv *env, int sock, const char *ifname);
@ -561,6 +561,7 @@ static int getFlags0(JNIEnv *env, jstring name) {
jboolean isCopy;
int ret, sock;
const char* name_utf;
int flags = 0;
name_utf = (*env)->GetStringUTFChars(env, name, &isCopy);
@ -571,7 +572,7 @@ static int getFlags0(JNIEnv *env, jstring name) {
name_utf = (*env)->GetStringUTFChars(env, name, &isCopy);
ret = getFlags(sock, name_utf);
ret = getFlags(sock, name_utf, &flags);
close(sock);
(*env)->ReleaseStringUTFChars(env, name, name_utf);
@ -581,7 +582,7 @@ static int getFlags0(JNIEnv *env, jstring name) {
return -1;
}
return ret;
return flags;
}
@ -852,6 +853,7 @@ netif *addif(JNIEnv *env, int sock, const char * if_name, netif *ifs, struct soc
int mask;
int isVirtual = 0;
int addr_size;
int flags = 0;
/*
* If the interface name is a logical interface then we
@ -906,7 +908,7 @@ netif *addif(JNIEnv *env, int sock, const char * if_name, netif *ifs, struct soc
* the 'parent' interface with the new records.
*/
*name_colonP = 0;
if (getFlags(sock, name) < 0) {
if (getFlags(sock, name, &flags) < 0 || flags < 0) {
// failed to access parent interface do not create parent.
// We are a virtual interface with no parent.
isVirtual = 1;
@ -1278,9 +1280,8 @@ static int getMTU(JNIEnv *env, int sock, const char *ifname) {
return if2.ifr_mtu;
}
static int getFlags(int sock, const char *ifname) {
static int getFlags(int sock, const char *ifname, int *flags) {
struct ifreq if2;
int ret = -1;
memset((char *) &if2, 0, sizeof(if2));
strcpy(if2.ifr_name, ifname);
@ -1289,7 +1290,12 @@ static int getFlags(int sock, const char *ifname) {
return -1;
}
return if2.ifr_flags;
if (sizeof(if2.ifr_flags) == sizeof(short)) {
*flags = (if2.ifr_flags & 0xffff);
} else {
*flags = if2.ifr_flags;
}
return 0;
}
#endif
@ -1663,7 +1669,7 @@ static int getMTU(JNIEnv *env, int sock, const char *ifname) {
}
static int getFlags(int sock, const char *ifname) {
static int getFlags(int sock, const char *ifname, int *flags) {
struct lifreq lifr;
memset((caddr_t)&lifr, 0, sizeof(lifr));
strcpy((caddr_t)&(lifr.lifr_name), ifname);
@ -1672,7 +1678,8 @@ static int getFlags(int sock, const char *ifname) {
return -1;
}
return lifr.lifr_flags;
*flags = lifr.lifr_flags;
return 0;
}
@ -1968,7 +1975,7 @@ static int getMTU(JNIEnv *env, int sock, const char *ifname) {
return if2.ifr_mtu;
}
static int getFlags(int sock, const char *ifname) {
static int getFlags(int sock, const char *ifname, int *flags) {
struct ifreq if2;
int ret = -1;
@ -1979,7 +1986,12 @@ static int getFlags(int sock, const char *ifname) {
return -1;
}
return (((int) if2.ifr_flags) & 0xffff);
if (sizeof(if2.ifr_flags) == sizeof(short)) {
*flags = (if2.ifr_flags & 0xffff);
} else {
*flags = if2.ifr_flags;
}
return 0;
}
#endif