xserver: Branch 'xorg-server-1.4-apple'

Jeremy Huddleston jeremyhu at kemper.freedesktop.org
Tue Aug 5 18:38:38 PDT 2008


 configure.ac                          |    2 -
 hw/xquartz/darwinEvents.c             |   10 +++++----
 hw/xquartz/mach-startup/bundle-main.c |   23 +++++++++++++++------
 include/os.h                          |    2 -
 os/connection.c                       |   37 ++++++++++++++++++++--------------
 5 files changed, 47 insertions(+), 27 deletions(-)

New commits:
commit 672682ebf973f287956661a2ff5a29a83a7a9d16
Author: Jeremy Huddleston <jeremyhu at freedesktop.org>
Date:   Tue Aug 5 18:38:30 2008 -0700

    XQuartz: Now properly disable xauth checking on launchd socket and mostly fix the xinitrc / launchd race condition

diff --git a/configure.ac b/configure.ac
index 13ef8f8..e964b05 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1764,7 +1764,7 @@ if test "x$XQUARTZ" = xyes; then
 
 	AC_CHECK_LIB([Xplugin],[xp_init],[:])
 
-	CFLAGS="${CFLAGS} -DROOTLESS_WORKAROUND -DNO_ALLOCA -DXQUARTZ_EXPORTS_LAUNCHD_FD"
+	CFLAGS="${CFLAGS} -DROOTLESS_WORKAROUND -DNO_ALLOCA"
 fi
 
 # Support for objc in autotools is minimal and not documented.
diff --git a/hw/xquartz/darwinEvents.c b/hw/xquartz/darwinEvents.c
index 9b39baa..b731c72 100644
--- a/hw/xquartz/darwinEvents.c
+++ b/hw/xquartz/darwinEvents.c
@@ -343,12 +343,16 @@ static void DarwinEventHandler(int screenNum, xEventPtr xe, DeviceIntPtr dev, in
     }
 }
 
+#ifdef XQUARTZ_EXPORTS_LAUNCHD_FD
 int xquartz_launchd_fd = -1;
+#endif
 
 void DarwinListenOnOpenFD(int fd) {
     ErrorF("DarwinListenOnOpenFD: %d\n", fd);
     
-#if 0
+#ifdef XQUARTZ_EXPORTS_LAUNCHD_FD
+    xquartz_launchd_fd = fd;
+#else
     pthread_mutex_lock(&fd_add_lock);
     if(fd_add_count < FD_ADD_MAX)
         fd_add[fd_add_count++] = fd;
@@ -357,8 +361,6 @@ void DarwinListenOnOpenFD(int fd) {
 
     pthread_cond_broadcast(&fd_add_ready_cond);
     pthread_mutex_unlock(&fd_add_lock);
-#else
-    xquartz_launchd_fd = fd;
 #endif
 }
 
@@ -378,7 +380,7 @@ static void kXquartzListenOnOpenFDHandler(int screenNum, xEventPtr xe, DeviceInt
     
     for (i=0; i<nevents; i++) {
         ErrorF("Calling ListenOnOpenFD() for new fd: %d\n", (int)xe[i].u.clientMessage.u.l.longs0);
-        ListenOnOpenFD((int)xe[i].u.clientMessage.u.l.longs0);
+        ListenOnOpenFD((int)xe[i].u.clientMessage.u.l.longs0, 1);
     }
 }
 
diff --git a/hw/xquartz/mach-startup/bundle-main.c b/hw/xquartz/mach-startup/bundle-main.c
index c138fe7..21a72d9 100644
--- a/hw/xquartz/mach-startup/bundle-main.c
+++ b/hw/xquartz/mach-startup/bundle-main.c
@@ -161,11 +161,18 @@ static void accept_fd_handoff(int connected_fd) {
     
     launchd_fd = *((int*)CMSG_DATA(cmsg));
     
-    if(launchd_fd == -1)
+    if(launchd_fd == -1) {
         fprintf(stderr, "X11.app: Error receiving $DISPLAY file descriptor, no descriptor received? %d\n", launchd_fd);
-        
-//    fprintf(stderr, "X11.app: Received new DISPLAY fd: %d ... sleeping before handoff to server thread\n", launchd_fd);
-//    sleep(5);
+        return;
+    }
+
+#ifndef XQUARTZ_EXPORTS_LAUNCHD_FD
+    fprintf(stderr, "X11.app: Received new DISPLAY fd: %d ... sleeping to allow xinitrc to catchup.\n", launchd_fd);
+
+    /* TODO: Clean up this race better... givint xinitrc time to run. */
+    sleep(2);
+#endif
+
     fprintf(stderr, "X11.app Handing off fd to server thread via DarwinListenOnOpenFD(%d)\n", launchd_fd);
     DarwinListenOnOpenFD(launchd_fd);
 }
@@ -328,10 +335,14 @@ int main(int argc, char **argv, char **envp) {
         if(display) {
             /* Could open the display, start the launcher */
             XCloseDisplay(display);
+
+#ifdef XQUARTZ_EXPORTS_LAUNCHD_FD
+            fprintf(stderr, "X11.app: Received new DISPLAY fd: %d ... sleeping to allow xinitrc to catchup.\n", launchd_fd);
             
             /* TODO: Clean up this race better... givint xinitrc time to run. */
             sleep(2);
-            
+#endif
+
             return execute(command_from_prefs("app_to_run", DEFAULT_CLIENT));
         }
     }
@@ -359,7 +370,7 @@ int main(int argc, char **argv, char **envp) {
     noPanoramiXExtension = TRUE;
     
     fprintf(stderr, "X11.app: main(): argc=%d\n", argc);
-    for(i=1; i < argc; i++) {
+    for(i=0; i < argc; i++) {
         fprintf(stderr, "\targv[%u] = %s\n", (unsigned)i, argv[i]);
         if(!strcmp(argv[i], "--listenonly")) {
             listenOnly = TRUE;
diff --git a/include/os.h b/include/os.h
index b6f7553..5b5ea21 100644
--- a/include/os.h
+++ b/include/os.h
@@ -168,7 +168,7 @@ extern void MakeClientGrabImpervious(ClientPtr /*client*/);
 extern void MakeClientGrabPervious(ClientPtr /*client*/);
 
 #ifdef XQUARTZ
-extern void ListenOnOpenFD(int /* fd */);
+extern void ListenOnOpenFD(int /* fd */, int /* noxauth */);
 #endif
 
 extern void AvailableClientInput(ClientPtr /* client */);
diff --git a/os/connection.c b/os/connection.c
index 8c4bcdc..4d4a623 100644
--- a/os/connection.c
+++ b/os/connection.c
@@ -669,11 +669,11 @@ ClientAuthorized(ClientPtr client,
     
     /* Allow any client to connect without authorization on a launchd socket,
        because it is securely created -- this prevents a race condition on launch */
-    if (saddr->sa_len > 11 && saddr->sa_family == AF_UNIX &&
-	!strncmp(saddr->sa_data, "/tmp/launch", 11))  goto done;
-
-    auth_id = CheckAuthorization (proto_n, auth_proto,
-				  string_n, auth_string, client, &reason);
+    if(trans_conn->flags | TRANS_NOXAUTH) {
+        auth_id = (XID) 0L;
+    } else {
+        auth_id = CheckAuthorization (proto_n, auth_proto, string_n, auth_string, client, &reason);
+    }
 
     if (auth_id == (XID) ~0L)
     {
@@ -727,7 +727,6 @@ ClientAuthorized(ClientPtr client,
 	}
     }
     priv->auth_id = auth_id;
-done:
     priv->conn_time = 0;
 
 #ifdef XDMCP
@@ -1264,12 +1263,17 @@ MakeClientGrabPervious(ClientPtr client)
 
 #ifdef XQUARTZ
 /* Add a fd (from launchd) to our listeners */
-_X_EXPORT void ListenOnOpenFD(int fd) {
-    char port[20];
+_X_EXPORT void ListenOnOpenFD(int fd, int noxauth) {
+    char port[256];
     XtransConnInfo ciptr;
-    
-    /* Sigh for inconsistencies. */  
-    sprintf (port, ":%d", atoi(display));
+
+    if(!strncmp(getenv("DISPLAY"), "/tmp/launch", 11)) {
+        /* Make the path the launchd socket if our DISPLAY is set right */
+        strcpy(port, getenv("DISPLAY"));
+    } else {
+        /* Just some default so things don't break and die. */
+        sprintf(port, ":%d", atoi(display));
+    }
 
     /* Make our XtransConnInfo
      * TRANS_SOCKET_LOCAL_INDEX = 5 from Xtrans.c
@@ -1280,6 +1284,9 @@ _X_EXPORT void ListenOnOpenFD(int fd) {
         return;
     }
     
+    if(noxauth)
+        ciptr->flags = ciptr->flags | TRANS_NOXAUTH;
+
     /* Allocate space to store it */
     ListenTransFds = (int *) xrealloc(ListenTransFds, (ListenTransCount + 1) * sizeof (int));
     ListenTransConns = (XtransConnInfo *) xrealloc(ListenTransConns, (ListenTransCount + 1) * sizeof (XtransConnInfo));
@@ -1294,11 +1301,11 @@ _X_EXPORT void ListenOnOpenFD(int fd) {
     /* Increment the count */
     ListenTransCount++;
 
-    /* This *might* be needed, but it seems to be working fine without it... */
-    //ResetAuthorization();
-    //ResetHosts(display);
+    /* This *might* not be needed... /shrug */
+    ResetAuthorization();
+    ResetHosts(display);
 #ifdef XDMCP
-    //XdmcpReset();
+    XdmcpReset();
 #endif
 }
 


More information about the xorg-commit mailing list