diff --git a/src/main.c b/src/main.c
index 7fc68b68fa9dd20e2f0fe4de501a159dc4461170..57aaeb63588505e82df37e1a505b0fd154d43012 100644
--- a/src/main.c
+++ b/src/main.c
@@ -91,16 +91,15 @@
 #define MAXPATHLEN 32768
 #endif
 
-static char master_location[MAXPATHLEN * 2] = MASTER_COOKIE;
+static const char _master_location[MAXPATHLEN+CONSTANT_STRLEN(MASTER_COOKIE)] = MASTER_COOKIE;
+static char *master_file_location = _master_location + CONSTANT_STRLEN(MASTER_COOKIE);
 
 static void set_master(const char *file)
 {
-  if (strlen(file) >= MAXPATHLEN*2 - CONSTANT_STRLEN(MASTER_COOKIE)) {
-    fprintf(stderr, "Too long path to master: \"%s\" (limit:%"PRINTPTRDIFFT"d)\n",
-	    file, MAXPATHLEN*2 - CONSTANT_STRLEN(MASTER_COOKIE));
-    exit(1);
-  }
-  strcpy(master_location + CONSTANT_STRLEN(MASTER_COOKIE), file);
+  if( master_file_location > _master_location+CONSTANT_STRLEN(MASTER_COOKIE)
+      || master_file_location < _master_location)
+    free(master_file_location);
+  master_file_location = strdup( file );
 }
 
 #ifdef __NT__
@@ -136,10 +135,9 @@ static void get_master_key(HKEY cat)
 
 static void set_default_master(const char *bin_name)
 {
-  char *mp = master_location + CONSTANT_STRLEN (MASTER_COOKIE);
-
+#define mp master_file_location
 #ifdef HAVE_GETENV
-  if(!*mp && getenv("PIKE_MASTER")) {
+  if(getenv("PIKE_MASTER")) {
     set_master(getenv("PIKE_MASTER"));
   }
 #endif
@@ -151,11 +149,13 @@ static void set_default_master(const char *bin_name)
 
   if(!*mp && strncmp(DEFAULT_MASTER, "NONE/", 5))
   {
-    SNPRINTF (mp, sizeof (master_location) - CONSTANT_STRLEN (MASTER_COOKIE),
+    char tmp[CONSTANT_STRLEN( DEFAULT_MASTER ) + 10 + 10 + 10];
+    SNPRINTF (tmp, sizeof(tmp)-1,
 	      DEFAULT_MASTER,
 	      PIKE_MAJOR_VERSION,
 	      PIKE_MINOR_VERSION,
 	      PIKE_BUILD_VERSION);
+    set_master( tmp );
   }
 
 #ifdef __NT__
@@ -169,27 +169,26 @@ static void set_default_master(const char *bin_name)
       char *p = strrchr (exepath, '\\');
       if (p) *p = 0;
       SNPRINTF (tmp, sizeof (tmp), "%s/%s", exepath, mp);
-      strncpy (mp, tmp,
-	       sizeof (master_location) - CONSTANT_STRLEN (MASTER_COOKIE));
+      set_master( tmp );
     }
   }
 #else
   if (!*mp) {
     /* Attempt to find a master via the path to the binary. */
     /* Note: We assume that MAXPATHLEN is > 18 characters. */
-    if (strlen(bin_name) < (2*MAXPATHLEN -
-			    CONSTANT_STRLEN(MASTER_COOKIE "master.pike"))) {
-      char *p;
-      strcpy(mp, bin_name);
-      p = strrchr(mp, '/');
-      if (!p) p = mp;
-      else p++;
-      strcpy(p, "master.pike");
-    }
+    char tmp[strlen(bin_name)];
+    char *p;
+    strcpy(tmp, bin_name);
+    p = strrchr(tmp, '/');
+    if (!p) p = tmp;
+    else p++;
+    strcpy(p, "master.pike");
+    set_master( tmp );
   }
 #endif
 
   TRACE((stderr, "Default master at \"%s\"...\n", mp));
+#undef mp
 }
 
 #ifdef LIBPIKE
@@ -270,8 +269,7 @@ static void find_lib_dir(int argc, char **argv)
   {
     char *p;
     char *dir;
-    memcpy(libpike_file, master_location + CONSTANT_STRLEN(MASTER_COOKIE),
-	   sizeof(master_location) - CONSTANT_STRLEN(MASTER_COOKIE));
+    strcpy(libpike_file, master_file_location);
     for (p = dir = libpike_file; *p; p++) {
       if ((*p == '/')
 #ifdef __NT__
@@ -375,7 +373,7 @@ int main(int argc, char **argv)
 
   TRACE((stderr, "init_pike()\n"));
 
-  init_pike(argv, master_location + CONSTANT_STRLEN(MASTER_COOKIE));
+  init_pike(argv, master_file_location);
 
   for(e=1; e<argc; e++)
   {
@@ -630,7 +628,7 @@ int main(int argc, char **argv)
    *       the MASTER_COOKIE string in the binary.
    */
   add_pike_string_constant("__master_cookie",
-			   master_location, CONSTANT_STRLEN(MASTER_COOKIE));
+			   _master_location, CONSTANT_STRLEN(MASTER_COOKIE));
 
   if(SETJMP(back))
   {