diff -u -r jack_old/jack/internal.h jack_new/jack/internal.h
--- jack_old/jack/internal.h	2005-08-22 21:48:24.000000000 +0100
+++ jack_new/jack/internal.h	2005-10-08 16:10:07.000000000 +0100
@@ -418,7 +418,7 @@
 
 extern char *jack_user_dir (void);
 
-extern char *jack_server_dir (const char *server_name);
+extern char *jack_server_dir (const char *server_name, char *server_dir);
 
 extern void *jack_zero_filled_buffer;
 
diff -u -r jack_old/jackd/engine.c jack_new/jackd/engine.c
--- jack_old/jackd/engine.c	2005-06-15 10:18:40.000000000 +0100
+++ jack_new/jackd/engine.c	2005-10-09 19:45:14.000000000 +0100
@@ -198,6 +198,7 @@
 make_socket_subdirectories (const char *server_name)
 {
 	struct stat statbuf;
+        char server_dir[PATH_MAX+1] = "";
 
 	/* check tmpdir directory */
 	if (stat (jack_tmpdir, &statbuf)) {
@@ -218,7 +219,7 @@
 	}
 
 	/* create server_name subdirectory */
-	if (make_directory (jack_server_dir (server_name)) < 0) {
+	if (make_directory (jack_server_dir (server_name, server_dir)) < 0) {
 		return -1;
 	}
 
@@ -230,6 +231,7 @@
 {
 	struct sockaddr_un addr;
 	int i;
+        char server_dir[PATH_MAX+1] = "";
 
 	if (make_socket_subdirectories (server_name) < 0) {
 		return -1;
@@ -246,7 +248,7 @@
 	addr.sun_family = AF_UNIX;
 	for (i = 0; i < 999; i++) {
 		snprintf (addr.sun_path, sizeof (addr.sun_path) - 1,
-			  "%s/jack_%d", jack_server_dir (server_name), i);
+			  "%s/jack_%d", jack_server_dir (server_name, server_dir), i);
 		if (access (addr.sun_path, F_OK) != 0) {
 			break;
 		}
@@ -284,7 +286,7 @@
 	addr.sun_family = AF_UNIX;
 	for (i = 0; i < 999; i++) {
 		snprintf (addr.sun_path, sizeof (addr.sun_path) - 1,
-			  "%s/jack_ack_%d", jack_server_dir (server_name), i);
+			  "%s/jack_ack_%d", jack_server_dir (server_name, server_dir), i);
 		if (access (addr.sun_path, F_OK) != 0) {
 			break;
 		}
@@ -1537,6 +1539,7 @@
 {
 	jack_engine_t *engine;
 	unsigned int i;
+        char server_dir[PATH_MAX+1] = "";
 
 #ifdef USE_CAPABILITIES
 	uid_t uid = getuid ();
@@ -1745,7 +1748,7 @@
 
 	snprintf (engine->fifo_prefix, sizeof (engine->fifo_prefix),
 		  "%s/jack-ack-fifo-%d",
-		  jack_server_dir (engine->server_name), getpid ());
+		  jack_server_dir (engine->server_name, server_dir), getpid ());
 
 	(void) jack_get_fifo_fd (engine, 0);
 
diff -u -r jack_old/jackd/jackd.c jack_new/jackd/jackd.c
--- jack_old/jackd/jackd.c	2005-06-15 10:18:40.000000000 +0100
+++ jack_new/jackd/jackd.c	2005-10-09 19:45:52.000000000 +0100
@@ -281,7 +281,7 @@
 		}
 	}
 
-	strncpy (descriptor->file, filename, PATH_MAX);
+	snprintf (descriptor->file, sizeof(descriptor->file), "%s", filename);
 	free (filename);
 
 	return descriptor;
@@ -399,7 +399,8 @@
 {
 	DIR *dir;
 	struct dirent *dirent;
-	char *dir_name = jack_server_dir (server_name);
+	char dir_name[PATH_MAX+1] = "";
+        jack_server_dir (server_name, dir_name);
 
 	/* On termination, we remove all files that jackd creates so
 	 * subsequent attempts to start jackd will not believe that an
@@ -425,7 +426,7 @@
 	/* unlink all the files in this directory, they are mine */
 	while ((dirent = readdir (dir)) != NULL) {
 
-		char fullpath[PATH_MAX];
+		char fullpath[PATH_MAX+1];
 
 		if ((strcmp (dirent->d_name, ".") == 0)
 		    || (strcmp (dirent->d_name, "..") == 0)) {
diff -u -r jack_old/libjack/client.c jack_new/libjack/client.c
--- jack_old/libjack/client.c	2005-09-11 00:58:43.000000000 +0100
+++ jack_new/libjack/client.c	2005-10-09 19:37:02.000000000 +0100
@@ -499,6 +499,8 @@
 	struct sockaddr_un addr;
 	int which = 0;
 
+        char server_dir[PATH_MAX+1] = "";
+
 	if ((fd = socket (AF_UNIX, SOCK_STREAM, 0)) < 0) {
 		jack_error ("cannot create client socket (%s)",
 			    strerror (errno));
@@ -510,7 +512,7 @@
 
 	addr.sun_family = AF_UNIX;
 	snprintf (addr.sun_path, sizeof (addr.sun_path) - 1, "%s/jack_%d",
-		  jack_server_dir (server_name), which);
+                  jack_server_dir (server_name, server_dir) , which);
 
 	if (connect (fd, (struct sockaddr *) &addr, sizeof (addr)) < 0) {
 		close (fd);
@@ -528,6 +530,8 @@
 	jack_client_connect_ack_request_t req;
 	jack_client_connect_ack_result_t res;
 
+        char server_dir[PATH_MAX+1] = "";
+
 	if ((fd = socket (AF_UNIX, SOCK_STREAM, 0)) < 0) {
 		jack_error ("cannot create client event socket (%s)",
 			    strerror (errno));
@@ -536,7 +540,7 @@
 
 	addr.sun_family = AF_UNIX;
 	snprintf (addr.sun_path, sizeof (addr.sun_path) - 1, "%s/jack_ack_0",
-		  jack_server_dir (server_name));
+		  jack_server_dir (server_name,server_dir));
 
 	if (connect (fd, (struct sockaddr *) &addr, sizeof (addr)) < 0) {
 		jack_error ("cannot connect to jack server for events",
@@ -1088,7 +1092,7 @@
 char *
 jack_user_dir (void)
 {
-	static char user_dir[PATH_MAX] = "";
+	static char user_dir[PATH_MAX+1] = "";
 
 	/* format the path name on the first call */
 	if (user_dir[0] == '\0') {
@@ -1101,15 +1105,13 @@
 
 /* returns the name of the per-server subdirectory of jack_user_dir() */
 char *
-jack_server_dir (const char *server_name)
+jack_server_dir (const char *server_name, char *server_dir)
 {
-	static char server_dir[PATH_MAX] = "";
+	/* format the path name into the suppled server_dir char array,
+	 * assuming that server_dir is at least as large as PATH_MAX+1 */
 
-	/* format the path name on the first call */
-	if (server_dir[0] == '\0') {
-		snprintf (server_dir, sizeof (server_dir), "%s/%s",
-			  jack_user_dir (), server_name);
-	}
+	snprintf (server_dir, PATH_MAX+1, "%s/%s",
+		  jack_user_dir (), server_name);
 
 	return server_dir;
 }
