diff --git a/src/tool_main.c b/src/tool_main.c
index 5e58aff1d0c5cee2434bdace36037e1780b65b02..e0766e9b7d0aa1def31b352ddd91b6b84b0e1485 100644
--- a/src/tool_main.c
+++ b/src/tool_main.c
@@ -33,6 +33,7 @@
 
 #include "tool_cfgable.h"
 #include "tool_convert.h"
+#include "tool_msgs.h"
 #include "tool_operate.h"
 #include "tool_panykey.h"
 #include "tool_vms.h"
@@ -120,10 +121,7 @@ void memory_tracking_init(void)
 int main(int argc, char *argv[])
 {
   int res;
-  struct Configurable config;
-
-  /* Initialise the config */
-  init_config(&config);
+  struct Configurable *config;
 
   main_checkfds();
 
@@ -134,15 +132,29 @@ int main(int argc, char *argv[])
   /* Initialize memory tracking */
   memory_tracking_init();
 
-  /* Start our curl operation */
-  res = operate(&config, argc, argv);
+  /* Allocate the initial config */
+  config = malloc(sizeof(struct Configurable));
+
+  if(config) {
+    /* Initialise the config */
+    init_config(config);
+
+    /* Start our curl operation */
+    res = operate(config, argc, argv);
 
 #ifdef __SYMBIAN32__
-  if(config.showerror)
-    tool_pressanykey();
+    if(config->showerror)
+      tool_pressanykey();
 #endif
 
-  free_config_fields(&config);
+    /* Free the config structure */
+    free_config_fields(config);
+    Curl_safefree(config);
+  }
+  else {
+    helpf(stderr, "error initializing curl\n");
+    res = CURLE_FAILED_INIT;
+  }
 
 #ifdef __NOVELL_LIBC__
   if(getenv("_IN_NETWARE_BASH_") == NULL)