mirror of
https://github.com/corda/corda.git
synced 2025-01-31 16:35:43 +00:00
Merge pull request #139 from dicej/master
don't throw UnknownHostException from InetAddress.getByName("0.0.0.0")
This commit is contained in:
commit
fd5bd9d77e
@ -10,8 +10,8 @@
|
|||||||
|
|
||||||
#include "jni.h"
|
#include "jni.h"
|
||||||
#include "avian/machine.h"
|
#include "avian/machine.h"
|
||||||
|
|
||||||
#include "sockets.h"
|
#include "sockets.h"
|
||||||
|
#include "jni-util.h"
|
||||||
|
|
||||||
using namespace avian::classpath::sockets;
|
using namespace avian::classpath::sockets;
|
||||||
|
|
||||||
@ -88,7 +88,8 @@ Java_java_net_InetAddress_ipv4AddressForName(JNIEnv* e,
|
|||||||
if (host) {
|
if (host) {
|
||||||
return ntohl(reinterpret_cast<in_addr*>(host->h_addr_list[0])->s_addr);
|
return ntohl(reinterpret_cast<in_addr*>(host->h_addr_list[0])->s_addr);
|
||||||
} else {
|
} else {
|
||||||
fprintf(stderr, "trouble %d\n", WSAGetLastError());
|
throwNew(e, "java/net/UnknownHostException", 0);
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
addrinfo hints;
|
addrinfo hints;
|
||||||
@ -100,19 +101,20 @@ Java_java_net_InetAddress_ipv4AddressForName(JNIEnv* e,
|
|||||||
int r = getaddrinfo(chars, 0, &hints, &result);
|
int r = getaddrinfo(chars, 0, &hints, &result);
|
||||||
e->ReleaseStringUTFChars(name, chars);
|
e->ReleaseStringUTFChars(name, chars);
|
||||||
|
|
||||||
jint address;
|
|
||||||
if (r != 0) {
|
if (r != 0) {
|
||||||
address = 0;
|
throwNew(e, "java/net/UnknownHostException", 0);
|
||||||
|
return 0;
|
||||||
} else {
|
} else {
|
||||||
address = ntohl
|
int address = ntohl
|
||||||
(reinterpret_cast<sockaddr_in*>(result->ai_addr)->sin_addr.s_addr);
|
(reinterpret_cast<sockaddr_in*>(result->ai_addr)->sin_addr.s_addr);
|
||||||
|
|
||||||
freeaddrinfo(result);
|
freeaddrinfo(result);
|
||||||
}
|
|
||||||
|
|
||||||
return address;
|
return address;
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
} else {
|
||||||
|
throwNew(e, "java/lang/OutOfMemoryError", 0);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@ -19,9 +19,6 @@ public class InetAddress {
|
|||||||
private InetAddress(String name) throws UnknownHostException {
|
private InetAddress(String name) throws UnknownHostException {
|
||||||
this.name = name;
|
this.name = name;
|
||||||
this.ip = ipv4AddressForName(name);
|
this.ip = ipv4AddressForName(name);
|
||||||
if (ip == 0) {
|
|
||||||
throw new UnknownHostException(name);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getHostName() {
|
public String getHostName() {
|
||||||
|
@ -286,6 +286,24 @@ public class Arrays {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static boolean equals(byte[] a, byte[] b) {
|
||||||
|
if(a == b) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if(a == null || b == null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if(a.length != b.length) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
for(int i = 0; i < a.length; i++) {
|
||||||
|
if(a[i] != b[i]) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
public static <T> List<T> asList(final T ... array) {
|
public static <T> List<T> asList(final T ... array) {
|
||||||
return new AbstractList<T>() {
|
return new AbstractList<T>() {
|
||||||
public int size() {
|
public int size() {
|
||||||
|
@ -48,6 +48,8 @@ public final class Unsafe {
|
|||||||
|
|
||||||
public native void putIntVolatile(Object o, long offset, int x);
|
public native void putIntVolatile(Object o, long offset, int x);
|
||||||
|
|
||||||
|
public native long getLongVolatile(Object o, long offset);
|
||||||
|
|
||||||
public native void putOrderedInt(Object o, long offset, int x);
|
public native void putOrderedInt(Object o, long offset, int x);
|
||||||
|
|
||||||
public native Object getObject(Object o, long offset);
|
public native Object getObject(Object o, long offset);
|
||||||
|
9
makefile
9
makefile
@ -652,7 +652,8 @@ ifeq ($(platform),darwin)
|
|||||||
sdk-dir = $(platform-dir)/Developer/SDKs
|
sdk-dir = $(platform-dir)/Developer/SDKs
|
||||||
|
|
||||||
ios-version := $(shell \
|
ios-version := $(shell \
|
||||||
if test -d $(sdk-dir)/$(target)6.1.sdk; then echo 6.1; \
|
if test -d $(sdk-dir)/$(target)7.0.sdk; then echo 7.0; \
|
||||||
|
elif test -d $(sdk-dir)/$(target)6.1.sdk; then echo 6.1; \
|
||||||
elif test -d $(sdk-dir)/$(target)6.0.sdk; then echo 6.0; \
|
elif test -d $(sdk-dir)/$(target)6.0.sdk; then echo 6.0; \
|
||||||
elif test -d $(sdk-dir)/$(target)5.1.sdk; then echo 5.1; \
|
elif test -d $(sdk-dir)/$(target)5.1.sdk; then echo 5.1; \
|
||||||
elif test -d $(sdk-dir)/$(target)5.0.sdk; then echo 5.0; \
|
elif test -d $(sdk-dir)/$(target)5.0.sdk; then echo 5.0; \
|
||||||
@ -666,6 +667,12 @@ ifeq ($(platform),darwin)
|
|||||||
|
|
||||||
ios-bin = $(platform-dir)/Developer/usr/bin
|
ios-bin = $(platform-dir)/Developer/usr/bin
|
||||||
|
|
||||||
|
found-gcc = $(shell if test -f $(ios-bin)/gcc; then echo true; else echo false; fi)
|
||||||
|
|
||||||
|
ifeq ($(found-gcc),false)
|
||||||
|
use-clang = true
|
||||||
|
endif
|
||||||
|
|
||||||
ifeq ($(use-clang),true)
|
ifeq ($(use-clang),true)
|
||||||
cxx = clang -std=c++11
|
cxx = clang -std=c++11
|
||||||
cc = clang
|
cc = clang
|
||||||
|
@ -19,8 +19,8 @@
|
|||||||
# include "libkern/OSAtomic.h"
|
# include "libkern/OSAtomic.h"
|
||||||
# include "libkern/OSCacheControl.h"
|
# include "libkern/OSCacheControl.h"
|
||||||
# include "mach/mach_types.h"
|
# include "mach/mach_types.h"
|
||||||
# include "mach/arm/thread_act.h"
|
# include "mach/thread_act.h"
|
||||||
# include "mach/arm/thread_status.h"
|
# include "mach/thread_status.h"
|
||||||
|
|
||||||
# define THREAD_STATE ARM_THREAD_STATE
|
# define THREAD_STATE ARM_THREAD_STATE
|
||||||
# define THREAD_STATE_TYPE arm_thread_state_t
|
# define THREAD_STATE_TYPE arm_thread_state_t
|
||||||
|
@ -48,6 +48,60 @@ resolveSystemClassThrow(Thread* t, object loader, object spec)
|
|||||||
(t, loader, spec, true, Machine::ClassNotFoundExceptionType);
|
(t, loader, spec, true, Machine::ClassNotFoundExceptionType);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
object
|
||||||
|
fieldForOffsetInClass(Thread* t, object c, unsigned offset)
|
||||||
|
{
|
||||||
|
object super = classSuper(t, c);
|
||||||
|
if (super) {
|
||||||
|
object field = fieldForOffsetInClass(t, super, offset);
|
||||||
|
if (field) {
|
||||||
|
return field;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
object table = classFieldTable(t, c);
|
||||||
|
if (table) {
|
||||||
|
for (unsigned i = 0; i < objectArrayLength(t, table); ++i) {
|
||||||
|
object field = objectArrayBody(t, table, i);
|
||||||
|
if ((fieldFlags(t, field) & ACC_STATIC) == 0
|
||||||
|
and fieldOffset(t, field) == offset)
|
||||||
|
{
|
||||||
|
return field;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
object
|
||||||
|
fieldForOffset(Thread* t, object o, unsigned offset)
|
||||||
|
{
|
||||||
|
object c = objectClass(t, o);
|
||||||
|
if (classVmFlags(t, c) & SingletonFlag) {
|
||||||
|
c = singletonObject(t, o, 0);
|
||||||
|
object table = classFieldTable(t, c);
|
||||||
|
if (table) {
|
||||||
|
for (unsigned i = 0; i < objectArrayLength(t, table); ++i) {
|
||||||
|
object field = objectArrayBody(t, table, i);
|
||||||
|
if ((fieldFlags(t, field) & ACC_STATIC)
|
||||||
|
and fieldOffset(t, field) == offset)
|
||||||
|
{
|
||||||
|
return field;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
abort(t);
|
||||||
|
} else {
|
||||||
|
object field = fieldForOffsetInClass(t, c, offset);
|
||||||
|
if (field) {
|
||||||
|
return field;
|
||||||
|
} else {
|
||||||
|
abort(t);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
extern "C" AVIAN_EXPORT void JNICALL
|
extern "C" AVIAN_EXPORT void JNICALL
|
||||||
@ -694,7 +748,7 @@ Avian_sun_misc_Unsafe_compareAndSwapLong
|
|||||||
return atomicCompareAndSwap64
|
return atomicCompareAndSwap64
|
||||||
(&fieldAtOffset<uint64_t>(target, offset), expect, update);
|
(&fieldAtOffset<uint64_t>(target, offset), expect, update);
|
||||||
#else
|
#else
|
||||||
ACQUIRE_FIELD_FOR_WRITE(t, local::fieldForOffset(t, target, offset));
|
ACQUIRE_FIELD_FOR_WRITE(t, fieldForOffset(t, target, offset));
|
||||||
if (fieldAtOffset<uint64_t>(target, offset) == expect) {
|
if (fieldAtOffset<uint64_t>(target, offset) == expect) {
|
||||||
fieldAtOffset<uint64_t>(target, offset) = update;
|
fieldAtOffset<uint64_t>(target, offset) = update;
|
||||||
return true;
|
return true;
|
||||||
@ -704,6 +758,36 @@ Avian_sun_misc_Unsafe_compareAndSwapLong
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
extern "C" AVIAN_EXPORT int64_t JNICALL
|
||||||
|
Avian_sun_misc_Unsafe_getLongVolatile
|
||||||
|
(Thread* t, object, uintptr_t* arguments)
|
||||||
|
{
|
||||||
|
object o = reinterpret_cast<object>(arguments[1]);
|
||||||
|
int64_t offset; memcpy(&offset, arguments + 2, 8);
|
||||||
|
|
||||||
|
// avoid blocking the VM if this is being called in a busy loop
|
||||||
|
PROTECT(t, o);
|
||||||
|
{ ENTER(t, Thread::IdleState); }
|
||||||
|
|
||||||
|
object field;
|
||||||
|
if (BytesPerWord < 8) {
|
||||||
|
field = fieldForOffset(t, o, offset);
|
||||||
|
|
||||||
|
PROTECT(t, field);
|
||||||
|
acquire(t, field);
|
||||||
|
}
|
||||||
|
|
||||||
|
int64_t result = fieldAtOffset<int64_t>(o, offset);
|
||||||
|
|
||||||
|
if (BytesPerWord < 8) {
|
||||||
|
release(t, field);
|
||||||
|
} else {
|
||||||
|
loadMemoryBarrier();
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
extern "C" AVIAN_EXPORT void JNICALL
|
extern "C" AVIAN_EXPORT void JNICALL
|
||||||
Avian_sun_misc_Unsafe_unpark
|
Avian_sun_misc_Unsafe_unpark
|
||||||
(Thread* t, object, uintptr_t* arguments)
|
(Thread* t, object, uintptr_t* arguments)
|
||||||
|
@ -2460,60 +2460,6 @@ pipeAvailable(int fd, int* available)
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
object
|
|
||||||
fieldForOffsetInClass(Thread* t, object c, unsigned offset)
|
|
||||||
{
|
|
||||||
object super = classSuper(t, c);
|
|
||||||
if (super) {
|
|
||||||
object field = fieldForOffsetInClass(t, super, offset);
|
|
||||||
if (field) {
|
|
||||||
return field;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
object table = classFieldTable(t, c);
|
|
||||||
if (table) {
|
|
||||||
for (unsigned i = 0; i < objectArrayLength(t, table); ++i) {
|
|
||||||
object field = objectArrayBody(t, table, i);
|
|
||||||
if ((fieldFlags(t, field) & ACC_STATIC) == 0
|
|
||||||
and fieldOffset(t, field) == offset)
|
|
||||||
{
|
|
||||||
return field;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
object
|
|
||||||
fieldForOffset(Thread* t, object o, unsigned offset)
|
|
||||||
{
|
|
||||||
object c = objectClass(t, o);
|
|
||||||
if (classVmFlags(t, c) & SingletonFlag) {
|
|
||||||
c = singletonObject(t, o, 0);
|
|
||||||
object table = classFieldTable(t, c);
|
|
||||||
if (table) {
|
|
||||||
for (unsigned i = 0; i < objectArrayLength(t, table); ++i) {
|
|
||||||
object field = objectArrayBody(t, table, i);
|
|
||||||
if ((fieldFlags(t, field) & ACC_STATIC)
|
|
||||||
and fieldOffset(t, field) == offset)
|
|
||||||
{
|
|
||||||
return field;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
abort(t);
|
|
||||||
} else {
|
|
||||||
object field = fieldForOffsetInClass(t, c, offset);
|
|
||||||
if (field) {
|
|
||||||
return field;
|
|
||||||
} else {
|
|
||||||
abort(t);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace local
|
} // namespace local
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
@ -2737,36 +2683,6 @@ Avian_sun_misc_Unsafe_getDouble__Ljava_lang_Object_2J
|
|||||||
(t, method, arguments);
|
(t, method, arguments);
|
||||||
}
|
}
|
||||||
|
|
||||||
extern "C" AVIAN_EXPORT int64_t JNICALL
|
|
||||||
Avian_sun_misc_Unsafe_getLongVolatile
|
|
||||||
(Thread* t, object, uintptr_t* arguments)
|
|
||||||
{
|
|
||||||
object o = reinterpret_cast<object>(arguments[1]);
|
|
||||||
int64_t offset; memcpy(&offset, arguments + 2, 8);
|
|
||||||
|
|
||||||
// avoid blocking the VM if this is being called in a busy loop
|
|
||||||
PROTECT(t, o);
|
|
||||||
{ ENTER(t, Thread::IdleState); }
|
|
||||||
|
|
||||||
object field;
|
|
||||||
if (BytesPerWord < 8) {
|
|
||||||
field = local::fieldForOffset(t, o, offset);
|
|
||||||
|
|
||||||
PROTECT(t, field);
|
|
||||||
acquire(t, field);
|
|
||||||
}
|
|
||||||
|
|
||||||
int64_t result = fieldAtOffset<int64_t>(o, offset);
|
|
||||||
|
|
||||||
if (BytesPerWord < 8) {
|
|
||||||
release(t, field);
|
|
||||||
} else {
|
|
||||||
loadMemoryBarrier();
|
|
||||||
}
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
extern "C" AVIAN_EXPORT void JNICALL
|
extern "C" AVIAN_EXPORT void JNICALL
|
||||||
Avian_sun_misc_Unsafe_putByte__Ljava_lang_Object_2JB
|
Avian_sun_misc_Unsafe_putByte__Ljava_lang_Object_2JB
|
||||||
(Thread*, object, uintptr_t* arguments)
|
(Thread*, object, uintptr_t* arguments)
|
||||||
|
@ -135,7 +135,7 @@ public class Misc {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void main(String[] args) {
|
public static void main(String[] args) throws Exception {
|
||||||
zam();
|
zam();
|
||||||
|
|
||||||
Bim bim = new Baz();
|
Bim bim = new Baz();
|
||||||
@ -287,6 +287,18 @@ public class Misc {
|
|||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
throw new RuntimeException(e);
|
throw new RuntimeException(e);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
expect(java.util.Arrays.equals
|
||||||
|
(new byte[] { 0, 0, 0, 0 },
|
||||||
|
java.net.InetAddress.getByName("0.0.0.0").getAddress()));
|
||||||
|
|
||||||
|
try {
|
||||||
|
java.net.InetAddress.getByName
|
||||||
|
("bs.thisdomaindoesntexistseriouslynoway");
|
||||||
|
throw new AssertionError();
|
||||||
|
} catch (java.net.UnknownHostException e) {
|
||||||
|
// cool
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected class Protected { }
|
protected class Protected { }
|
||||||
|
Loading…
x
Reference in New Issue
Block a user