--- a/src/server/lockdb.c
+++ b/src/server/lockdb.c
@@ -53,19 +53,29 @@
 
 int lock_db(void)
 {
-    char new_lock[MAXHOSTNAMELEN + 3 + 3 * sizeof(pid_t)];
-    char current_lock[MAXHOSTNAMELEN + 4 + 3 * sizeof(pid_t)];
+    char *new_lock;
+    char *current_lock;
     char *end;
     int retry;
     size_t sz;
     size_t ix;
     pid_t pid;
-    
 
-    if (gethostname(new_lock, MAXHOSTNAMELEN) == -1)
-	restart_kom("gethostname failed (%d)\n", errno);
+    size_t lock_sz = 16;
+    do {
+	new_lock = malloc(lock_sz + 3 + 3 * sizeof(pid_t));
+	if (!new_lock) restart_kom("malloc failed (%d)\n", errno);
+	int ret = gethostname(new_lock, lock_sz);
+	if (ret == -1) {
+	    if (errno == ENAMETOOLONG) {
+		free(new_lock);
+		lock_sz *= 2;
+	    } else {
+		restart_kom("gethostname failed (%d)\n", errno);
+	    }
+	} else break;
+    } while (1);
 
-    new_lock[MAXHOSTNAMELEN+1] = '\0';
     end = strchr(new_lock, '\0');
     sprintf(end, ":%ld", (long)getpid());
 
@@ -88,17 +98,25 @@ int lock_db(void)
 	    return -1;
 	}
 
-	sz = readlink(param.lockfile_name, current_lock, sizeof(current_lock));
-	if (sz >= sizeof(current_lock) - 1)
-	    restart_kom("Too much data in lock symlink %s\n",
-			param.lockfile_name);
+	lock_sz = 16;
+	do {
+	    current_lock = malloc(lock_sz);
+	    sz = readlink(param.lockfile_name, current_lock, lock_sz);
+	    if (sz >= lock_sz) {
+		free(current_lock);
+		lock_sz *= 2;
+	    } else {
+		break;
+	    }
+	} while (1);
 	current_lock[sz] = '\0';
 
-	for (ix = 0; ix < sizeof(new_lock); ++ix)
+	for (ix = 0; ix < lock_sz && current_lock[ix] && new_lock[ix]; ++ix)
 	{
 	    if (new_lock[ix] != current_lock[ix])
 	    {
 		kom_log("Database already locked by %s\n", current_lock);
+		free(new_lock); free(current_lock);
 		return -1;
 	    }
 
@@ -114,6 +132,7 @@ int lock_db(void)
 	if (kill(pid, 0) == 0 || errno != ESRCH)
 	{
 	    kom_log("Database already locked by %s\n", current_lock);
+	    free(new_lock); free(current_lock);
 	    return -1;
 	}
 
@@ -124,6 +143,8 @@ int lock_db(void)
 			param.lockfile_name);
 	else
 	    kom_log("Removed stale lock file left by %s.\n", current_lock);
+
+	free(new_lock); free(current_lock);
     }
     restart_kom("Unreachable code reached in lock_db.\n");
 }
