changeset 53646:8c55b1b400d5

(main): Stop if socket name too long. Only try su-fallback if the socket name was not explicit. Check socket name length in su-fallback case as well.
author Stefan Monnier <monnier@iro.umontreal.ca>
date Tue, 20 Jan 2004 23:25:33 +0000
parents 2d500253c58f
children 5e31be49b42d
files lib-src/emacsclient.c
diffstat 1 files changed, 20 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/lib-src/emacsclient.c	Tue Jan 20 23:09:25 2004 +0000
+++ b/lib-src/emacsclient.c	Tue Jan 20 23:25:33 2004 +0000
@@ -1,5 +1,5 @@
 /* Client process that communicates with GNU Emacs acting as server.
-   Copyright (C) 1986, 1987, 1994, 1999, 2000, 2001, 2003
+   Copyright (C) 1986, 1987, 1994, 1999, 2000, 2001, 2003, 2004
    Free Software Foundation, Inc.
 
 This file is part of GNU Emacs.
@@ -358,9 +358,10 @@
 
   {
     int sock_status = 0;
+    int default_sock = !socket_name;
     int saved_errno;
 
-    if (! socket_name)
+    if (default_sock)
       {
 	socket_name = alloca (system_name_length + 100);
 	sprintf (socket_name, "/tmp/emacs%d-%s/server",
@@ -370,13 +371,16 @@
     if (strlen (socket_name) < sizeof (server.sun_path))
       strcpy (server.sun_path, socket_name);
     else
-      fprintf (stderr, "%s: socket-name %s too long",
-	       argv[0], socket_name);
+      {
+	fprintf (stderr, "%s: socket-name %s too long",
+		 argv[0], socket_name);
+	exit (1);
+      }
 
     /* See if the socket exists, and if it's owned by us. */
     sock_status = socket_status (server.sun_path);
     saved_errno = errno;
-    if (sock_status)
+    if (sock_status && default_sock)
       {
 	/* Failing that, see if LOGNAME or USER exist and differ from
 	   our euid.  If so, look for a socket based on the UID
@@ -393,8 +397,18 @@
 	    if (pw && (pw->pw_uid != geteuid ()))
 	      {
 		/* We're running under su, apparently. */
-		sprintf (server.sun_path, "/tmp/emacs%d-%s/server",
+		sprintf (socket_name, "/tmp/emacs%d-%s/server",
 			 (int) pw->pw_uid, system_name);
+
+		if (strlen (socket_name) < sizeof (server.sun_path))
+		  strcpy (server.sun_path, socket_name);
+		else
+		  {
+		    fprintf (stderr, "%s: socket-name %s too long",
+			     argv[0], socket_name);
+		    exit (1);
+		  }
+
 		sock_status = socket_status (server.sun_path);
 		saved_errno = errno;
 	      }