Fix possible SEGV when using native dns resolver on macos (#10971)
Motivation: We should add some more NULL checks to ensure we not SEGV in some cases Modifications: Add more NULL checks Result: More robust implementation
This commit is contained in:
parent
df10dfbb49
commit
5c522916f7
@ -45,7 +45,9 @@ static jmethodID dnsResolverMethodId = NULL;
|
|||||||
// https://opensource.apple.com/tarballs/mDNSResponder/
|
// https://opensource.apple.com/tarballs/mDNSResponder/
|
||||||
static jobjectArray netty_resolver_dns_macos_resolvers(JNIEnv* env, jclass clazz) {
|
static jobjectArray netty_resolver_dns_macos_resolvers(JNIEnv* env, jclass clazz) {
|
||||||
dns_config_t* config = dns_configuration_copy();
|
dns_config_t* config = dns_configuration_copy();
|
||||||
|
if (config == NULL) {
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
jobjectArray array = (*env)->NewObjectArray(env, config->n_resolver, dnsResolverClass, NULL);
|
jobjectArray array = (*env)->NewObjectArray(env, config->n_resolver, dnsResolverClass, NULL);
|
||||||
if (array == NULL) {
|
if (array == NULL) {
|
||||||
goto error;
|
goto error;
|
||||||
@ -53,6 +55,9 @@ static jobjectArray netty_resolver_dns_macos_resolvers(JNIEnv* env, jclass clazz
|
|||||||
|
|
||||||
for (int i = 0; i < config->n_resolver; i++) {
|
for (int i = 0; i < config->n_resolver; i++) {
|
||||||
dns_resolver_t* resolver = config->resolver[i];
|
dns_resolver_t* resolver = config->resolver[i];
|
||||||
|
if (resolver == NULL) {
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
jstring domain = NULL;
|
jstring domain = NULL;
|
||||||
|
|
||||||
if (resolver->domain != NULL) {
|
if (resolver->domain != NULL) {
|
||||||
@ -68,7 +73,11 @@ static jobjectArray netty_resolver_dns_macos_resolvers(JNIEnv* env, jclass clazz
|
|||||||
}
|
}
|
||||||
|
|
||||||
for (int a = 0; a < resolver->n_nameserver; a++) {
|
for (int a = 0; a < resolver->n_nameserver; a++) {
|
||||||
jbyteArray address = netty_unix_socket_createInetSocketAddressArray(env, (const struct sockaddr_storage *) resolver->nameserver[a]);
|
const struct sockaddr_storage* addr = (const struct sockaddr_storage *) resolver->nameserver[a];
|
||||||
|
if (addr == NULL) {
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
jbyteArray address = netty_unix_socket_createInetSocketAddressArray(env, addr);
|
||||||
if (address == NULL) {
|
if (address == NULL) {
|
||||||
netty_unix_errors_throwOutOfMemoryError(env);
|
netty_unix_errors_throwOutOfMemoryError(env);
|
||||||
goto error;
|
goto error;
|
||||||
@ -84,7 +93,11 @@ static jobjectArray netty_resolver_dns_macos_resolvers(JNIEnv* env, jclass clazz
|
|||||||
}
|
}
|
||||||
|
|
||||||
for (int a = 0; a < resolver->n_search; a++) {
|
for (int a = 0; a < resolver->n_search; a++) {
|
||||||
jstring search = (*env)->NewStringUTF(env, resolver->search[a]);
|
char* s = resolver->search[a];
|
||||||
|
if (s == NULL) {
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
jstring search = (*env)->NewStringUTF(env, s);
|
||||||
if (search == NULL) {
|
if (search == NULL) {
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
@ -114,7 +127,9 @@ static jobjectArray netty_resolver_dns_macos_resolvers(JNIEnv* env, jclass clazz
|
|||||||
dns_configuration_free(config);
|
dns_configuration_free(config);
|
||||||
return array;
|
return array;
|
||||||
error:
|
error:
|
||||||
dns_configuration_free(config);
|
if (config != NULL) {
|
||||||
|
dns_configuration_free(config);
|
||||||
|
}
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user