]> git.ipfire.org Git - thirdparty/curl.git/commitdiff
avoid use of alloca()
authorYang Tse <yangsita@gmail.com>
Wed, 22 Apr 2009 10:25:28 +0000 (10:25 +0000)
committerYang Tse <yangsita@gmail.com>
Wed, 22 Apr 2009 10:25:28 +0000 (10:25 +0000)
ares/ares_init.c

index 635efceed9a7f36cc8eeca69670bfe7aae2aaaf2..da6a04c40f318a5718f9fda84732b35f80388ab6 100644 (file)
@@ -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);