diff options
author | Yang Tse <yangsita@gmail.com> | 2009-04-22 10:25:28 +0000 |
---|---|---|
committer | Yang Tse <yangsita@gmail.com> | 2009-04-22 10:25:28 +0000 |
commit | 137ef367578d01b564ef19d217c2b3f78c672f20 (patch) | |
tree | df805b9c42bf2e5fd36fc401553e9f2cf6669642 /ares | |
parent | 33a3753c3f41d546ebf3350685eb7201d25783f4 (diff) |
avoid use of alloca()
Diffstat (limited to 'ares')
-rw-r--r-- | ares/ares_init.c | 16 |
1 files changed, 12 insertions, 4 deletions
diff --git a/ares/ares_init.c b/ares/ares_init.c index 635efceed..da6a04c40 100644 --- a/ares/ares_init.c +++ b/ares/ares_init.c @@ -558,7 +558,7 @@ static int get_res_interfaces_nt(HKEY hKey, const char *subkey, char **obuf) static int get_iphlpapi_dns_info (char *ret_buf, size_t ret_size) { - FIXED_INFO *fi = alloca (sizeof(*fi)); + FIXED_INFO *fi, *newfi; DWORD size = sizeof (*fi); typedef DWORD (WINAPI* get_net_param_func) (FIXED_INFO*, DWORD*); get_net_param_func fpGetNetworkParams; /* available only on Win-98/2000+ */ @@ -571,12 +571,13 @@ static int get_iphlpapi_dns_info (char *ret_buf, size_t ret_size) char *ret = ret_buf; HRESULT res; + fi = malloc(size); if (!fi) return (0); handle = LoadLibrary ("iphlpapi.dll"); if (!handle) - return (0); + goto quit; fpGetNetworkParams = (get_net_param_func) GetProcAddress (handle, "GetNetworkParams"); if (!fpGetNetworkParams) @@ -586,8 +587,13 @@ static int get_iphlpapi_dns_info (char *ret_buf, size_t ret_size) if ((res != ERROR_BUFFER_OVERFLOW) && (res != ERROR_SUCCESS)) goto quit; - fi = alloca (size); - if (!fi || (*fpGetNetworkParams) (fi, &size) != ERROR_SUCCESS) + newfi = realloc(fi, size); + if (!newfi) + goto quit; + + fi = newfi; + res = (*fpGetNetworkParams) (fi, &size); + if (res != ERROR_SUCCESS) goto quit; if (debug) @@ -620,6 +626,8 @@ static int get_iphlpapi_dns_info (char *ret_buf, size_t ret_size) } quit: + if (fi) + free(fi); if (handle) FreeLibrary (handle); |