On Mon, 2016-01-11 at 22:07 +0300, Donat Enikeev wrote:
> -static void initialise_resolver( void )
> +static res_state initialise_resolver( void )
> {
> - if ((_res.options & RES_INIT) == 0)
> - res_init();
> + res_state dns_res_state = NULL;
No need to initialize this variable. Why the dns_ prefix on local variables?
> + if ( !(dns_res_state = heap_alloc_zero(sizeof(struct __res_state))) )
> + return NULL;
> +
> + res_ninit(dns_res_state);
> +
> + return dns_res_state;
> }
> @@ -706,6 +719,7 @@ DNS_STATUS WINAPI DnsQuery_UTF8( PCSTR name, WORD type, DWORD options, PVOID ser
> {
> DNS_STATUS ret = DNS_ERROR_RCODE_NOT_IMPLEMENTED;
> #ifdef HAVE_RESOLV
> + res_state dns_res_state;
>
> TRACE( "(%s,%s,0x%08x,%p,%p,%p)\n", debugstr_a(name), dns_type_to_str( type ),
> options, servers, result, reserved );
> @@ -713,13 +727,15 @@ DNS_STATUS WINAPI DnsQuery_UTF8( PCSTR name, WORD type, DWORD options, PVOID ser
> if (!name || !result)
> return ERROR_INVALID_PARAMETER;
>
> - initialise_resolver();
> - _res.options |= dns_map_options( options );
> + dns_res_state = initialise_resolver();
> + if ( !dns_res_state ) return ERROR_NOT_ENOUGH_MEMORY;
>
> - if (servers && (ret = dns_set_serverlist( servers )))
> + dns_res_state->options |= dns_map_options( options );
> +
> + if (servers && (ret = dns_set_serverlist( dns_res_state, servers )))
> return ret;
You are leaking dns_res_state here.
> @@ -824,8 +842,9 @@ DNS_STATUS WINAPI DnsQueryConfig( DNS_CONFIG_TYPE config, DWORD flag, PCWSTR ada
> case DnsConfigDnsServerList:
> {
> #ifdef HAVE_RESOLV
> - initialise_resolver();
> - ret = dns_get_serverlist( buffer, len );
> + res_state dns_res_state = initialise_resolver();
> + ret = dns_get_serverlist( dns_res_state, buffer, len );
> + heap_free(dns_res_state);
You should check the return value of initialise_resolver() here too.