diff options
author | Jeremy Huddleston <jeremyhu@freedesktop.org> | 2008-08-06 10:23:31 -0700 |
---|---|---|
committer | Jeremy Huddleston <jeremyhu@freedesktop.org> | 2008-08-06 13:37:21 -0700 |
commit | e72b1d21e44712e90595b1c31e67db6786d0d1bd (patch) | |
tree | 2e22a9777f4c670b993c1224e7b8ed73874000f7 | |
parent | d1b96cdea96f5321e0d254abde81cdaab2eca979 (diff) |
XQuartz: Now properly disable xauth checking on launchd socket and mostly fix the xinitrc / launchd race condition
-rw-r--r-- | configure.ac | 2 | ||||
-rw-r--r-- | hw/xquartz/darwinEvents.c | 10 | ||||
-rw-r--r-- | hw/xquartz/mach-startup/bundle-main.c | 23 | ||||
-rw-r--r-- | include/os.h | 2 | ||||
-rw-r--r-- | os/connection.c | 52 |
5 files changed, 52 insertions, 37 deletions
diff --git a/configure.ac b/configure.ac index 8ad331d65..570a6885c 100644 --- a/configure.ac +++ b/configure.ac @@ -1545,7 +1545,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 9b39baab4..b731c72c3 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 c138fe744..21a72d951 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 7c8477209..ac418ce44 100644 --- a/include/os.h +++ b/include/os.h @@ -166,7 +166,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 8e9121bfb..c0bdd1ad7 100644 --- a/os/connection.c +++ b/os/connection.c @@ -74,9 +74,7 @@ SOFTWARE. #define TRANS_SERVER #define TRANS_REOPEN #include <X11/Xtrans/Xtrans.h> -#ifdef HAVE_LAUNCHD #include <X11/Xtrans/Xtransint.h> -#endif #include <errno.h> #include <signal.h> #include <stdio.h> @@ -661,23 +659,22 @@ ClientAuthorized(ClientPtr client, XID auth_id; char *reason = NULL; XtransConnInfo trans_conn; -#ifdef HAVE_LAUNCHD - struct sockaddr *saddr; -#endif priv = (OsCommPtr)client->osPrivate; trans_conn = priv->trans_conn; -#ifdef HAVE_LAUNCHD - saddr = (struct sockaddr *) (trans_conn->addr); - /* 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; +/* Make it compile for now, remove this once we have a new xtrans release and are depending on it in configure.ac */ +#ifndef TRANS_NOXAUTH +#define TRANS_NOXAUTH 0 #endif - auth_id = CheckAuthorization (proto_n, auth_proto, - string_n, auth_string, client, &reason); + /* Allow any client to connect without authorization on a launchd socket, + because it is securely created -- this prevents a race condition on launch */ + 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) { @@ -725,9 +722,6 @@ ClientAuthorized(ClientPtr client, } } priv->auth_id = auth_id; -#ifdef HAVE_LAUNCHD - done: -#endif priv->conn_time = 0; #ifdef XDMCP @@ -1269,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 @@ -1285,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)); @@ -1299,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 } |