mirror of
https://github.com/zerotier/ZeroTierOne.git
synced 2024-12-23 23:02:23 +00:00
newInetAddress and newInetSocketAddress work
allow newInetSocketAddress to return NULL if given empty address
This commit is contained in:
parent
e1c16a8e68
commit
132bff25df
@ -132,6 +132,10 @@ jobject newInetAddress(JNIEnv *env, const sockaddr_storage &addr)
|
|||||||
InetAddress_class, InetAddress_getByAddress_method, buff);
|
InetAddress_class, InetAddress_getByAddress_method, buff);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
default:
|
||||||
|
{
|
||||||
|
assert(false && "addr.ss_family is neither AF_INET6 nor AF_INET");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if(env->ExceptionCheck() || inetAddressObj == NULL) {
|
if(env->ExceptionCheck() || inetAddressObj == NULL) {
|
||||||
LOGE("Error creating InetAddress object");
|
LOGE("Error creating InetAddress object");
|
||||||
@ -171,11 +175,16 @@ int addressPort(const sockaddr_storage addr) {
|
|||||||
return port;
|
return port;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// addr may be empty
|
||||||
|
//
|
||||||
|
// may return NULL
|
||||||
|
//
|
||||||
jobject newInetSocketAddress(JNIEnv *env, const sockaddr_storage &addr)
|
jobject newInetSocketAddress(JNIEnv *env, const sockaddr_storage &addr)
|
||||||
{
|
{
|
||||||
LOGV("newInetSocketAddress Called");
|
LOGV("newInetSocketAddress Called");
|
||||||
|
|
||||||
if(addr.ss_family == 0)
|
if(isSocketAddressEmpty(addr))
|
||||||
{
|
{
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@ -184,39 +193,15 @@ jobject newInetSocketAddress(JNIEnv *env, const sockaddr_storage &addr)
|
|||||||
|
|
||||||
if(env->ExceptionCheck() || inetAddressObject == NULL)
|
if(env->ExceptionCheck() || inetAddressObject == NULL)
|
||||||
{
|
{
|
||||||
LOGE("Error creating new inet address");
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
int port = 0;
|
int port = addressPort(addr);
|
||||||
switch(addr.ss_family)
|
|
||||||
{
|
|
||||||
case AF_INET6:
|
|
||||||
{
|
|
||||||
LOGV("IPV6 Address");
|
|
||||||
sockaddr_in6 *ipv6 = (sockaddr_in6*)&addr;
|
|
||||||
port = ntohs(ipv6->sin6_port);
|
|
||||||
LOGV("Port %d", port);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case AF_INET:
|
|
||||||
{
|
|
||||||
LOGV("IPV4 Address");
|
|
||||||
sockaddr_in *ipv4 = (sockaddr_in*)&addr;
|
|
||||||
port = ntohs(ipv4->sin_port);
|
|
||||||
LOGV("Port: %d", port);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
{
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
jobject inetSocketAddressObject = env->NewObject(InetSocketAddress_class, InetSocketAddress_ctor, inetAddressObject, port);
|
jobject inetSocketAddressObject = env->NewObject(InetSocketAddress_class, InetSocketAddress_ctor, inetAddressObject, port);
|
||||||
if(env->ExceptionCheck() || inetSocketAddressObject == NULL) {
|
if(env->ExceptionCheck() || inetSocketAddressObject == NULL) {
|
||||||
LOGE("Error creating InetSocketAddress object");
|
LOGE("Error creating InetSocketAddress object");
|
||||||
|
return NULL;
|
||||||
}
|
}
|
||||||
return inetSocketAddressObject;
|
return inetSocketAddressObject;
|
||||||
}
|
}
|
||||||
@ -225,9 +210,11 @@ jobject newPeerPhysicalPath(JNIEnv *env, const ZT_PeerPhysicalPath &ppp)
|
|||||||
{
|
{
|
||||||
LOGV("newPeerPhysicalPath Called");
|
LOGV("newPeerPhysicalPath Called");
|
||||||
|
|
||||||
|
//
|
||||||
|
// may be NULL
|
||||||
|
//
|
||||||
jobject addressObject = newInetSocketAddress(env, ppp.address);
|
jobject addressObject = newInetSocketAddress(env, ppp.address);
|
||||||
if(env->ExceptionCheck() || addressObject == NULL) {
|
if(env->ExceptionCheck()) {
|
||||||
LOGE("Error creating InetSocketAddress object");
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -414,12 +414,18 @@ namespace {
|
|||||||
return -100;
|
return -100;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// may be NULL
|
||||||
|
//
|
||||||
jobject remoteAddressObj = newInetSocketAddress(env, *remoteAddress);
|
jobject remoteAddressObj = newInetSocketAddress(env, *remoteAddress);
|
||||||
|
if (env->ExceptionCheck()) {
|
||||||
|
return -101;
|
||||||
|
}
|
||||||
const unsigned char *bytes = static_cast<const unsigned char *>(buffer);
|
const unsigned char *bytes = static_cast<const unsigned char *>(buffer);
|
||||||
jbyteArray bufferObj = newByteArray(env, bytes, bufferSize);
|
jbyteArray bufferObj = newByteArray(env, bytes, bufferSize);
|
||||||
if (env->ExceptionCheck() || bufferObj == NULL)
|
if (env->ExceptionCheck() || bufferObj == NULL)
|
||||||
{
|
{
|
||||||
return -101;
|
return -102;
|
||||||
}
|
}
|
||||||
|
|
||||||
int retval = env->CallIntMethod(ref->packetSender, PacketSender_onSendPacketRequested_method, localSocket, remoteAddressObj, bufferObj);
|
int retval = env->CallIntMethod(ref->packetSender, PacketSender_onSendPacketRequested_method, localSocket, remoteAddressObj, bufferObj);
|
||||||
@ -446,30 +452,11 @@ namespace {
|
|||||||
ref->jvm->GetEnv((void**)&env, JNI_VERSION_1_6);
|
ref->jvm->GetEnv((void**)&env, JNI_VERSION_1_6);
|
||||||
|
|
||||||
//
|
//
|
||||||
// was:
|
// may be NULL
|
||||||
// struct sockaddr_storage nullAddress = {0};
|
|
||||||
//
|
//
|
||||||
// but was getting this warning:
|
jobject remoteAddressObj = newInetSocketAddress(env, *remoteAddress);
|
||||||
// warning: suggest braces around initialization of subobject
|
if (env->ExceptionCheck()) {
|
||||||
//
|
return true;
|
||||||
// when building ZeroTierOne
|
|
||||||
//
|
|
||||||
struct sockaddr_storage nullAddress;
|
|
||||||
|
|
||||||
//
|
|
||||||
// It is possible to assume knowledge about internals of sockaddr_storage and construct
|
|
||||||
// correct 0-initializer, but it is simpler to just treat sockaddr_storage as opaque and
|
|
||||||
// use memset here to fill with 0
|
|
||||||
//
|
|
||||||
// This is also done in InetAddress.hpp for InetAddress
|
|
||||||
//
|
|
||||||
memset(&nullAddress, 0, sizeof(sockaddr_storage));
|
|
||||||
|
|
||||||
jobject remoteAddressObj = NULL;
|
|
||||||
|
|
||||||
if(memcmp(remoteAddress, &nullAddress, sizeof(sockaddr_storage)) != 0)
|
|
||||||
{
|
|
||||||
remoteAddressObj = newInetSocketAddress(env, *remoteAddress);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return env->CallBooleanMethod(ref->pathChecker, PathChecker_onPathCheck_method, address, localSocket, remoteAddressObj);
|
return env->CallBooleanMethod(ref->pathChecker, PathChecker_onPathCheck_method, address, localSocket, remoteAddressObj);
|
||||||
|
Loading…
Reference in New Issue
Block a user