From 492ac282bf79bd757f50f97b55cce79a0a5c6836 Mon Sep 17 00:00:00 2001 From: Shirish Kuncolienkar Date: Mon, 13 Aug 2012 13:41:23 +0100 Subject: [PATCH] 7190254: NetworkInterface getFlags implementation should support full integer bit range for flags value Reviewed-by: chegar --- .../native/java/net/NetworkInterface.c | 34 +++++++++++++------ 1 file changed, 23 insertions(+), 11 deletions(-) diff --git a/jdk/src/solaris/native/java/net/NetworkInterface.c b/jdk/src/solaris/native/java/net/NetworkInterface.c index 69780f7bc16..9ebea2bf517 100644 --- a/jdk/src/solaris/native/java/net/NetworkInterface.c +++ b/jdk/src/solaris/native/java/net/NetworkInterface.c @@ -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