--- XFree86-4.3.0/xc/lib/xtrans/Xtransint.h.xtmppath 2002-11-25 20:12:30.000000000 -0500 +++ XFree86-4.3.0/xc/lib/xtrans/Xtransint.h 2003-04-09 15:16:48.000000000 -0400 @@ -421,6 +421,7 @@ char *, /* path */ int /* mode */ ); +static char *MakeTempPathFromTmpString(const char *path); #endif /* --- XFree86-4.3.0/xc/lib/xtrans/Xtranslcl.c.xtmppath 2002-11-25 20:12:30.000000000 -0500 +++ XFree86-4.3.0/xc/lib/xtrans/Xtranslcl.c 2003-04-09 15:16:48.000000000 -0400 @@ -424,6 +424,7 @@ #ifdef PTSNODENAME int fd, server; char server_path[64], *slave; + char *x_streams_dir; int mode; #endif @@ -448,11 +449,15 @@ #else mode = 0777; #endif - if (trans_mkdir(X_STREAMS_DIR, mode) == -1) { + + x_streams_dir = MakeTempPathFromTmpString (X_STREAMS_DIR); + if (trans_mkdir(x_streams_dir, mode) == -1) { PRMSG (1, "PTSOpenServer: mkdir(%s) failed, errno = %d\n", - X_STREAMS_DIR, errno, 0); + x_streams_dir, errno, 0); + free (x_streams_dir); return(-1); } + free (x_streams_dir); #if 0 if( (fd=open(server_path, O_RDWR)) >= 0 ) { @@ -630,6 +635,7 @@ char server_path[64]; struct stat filestat; extern int isastream(); + char *namednodename; #endif PRMSG(2,"NAMEDOpenClient(%s)\n", port, 0,0 ); @@ -638,15 +644,17 @@ PRMSG(1,"NAMEDOpenClient: Protocol is not supported by a NAMED connection\n", 0,0,0); return -1; #else + namednodename = MakeTempPathFromTmpString (NAMEDNODENAME); if ( port && *port ) { if( *port == '/' ) { /* A full pathname */ (void) sprintf(server_path, "%s", port); } else { - (void) sprintf(server_path, "%s%s", NAMEDNODENAME, port); + (void) sprintf(server_path, "%s%s", namednodename, port); } } else { - (void) sprintf(server_path, "%s%ld", NAMEDNODENAME, (long)getpid()); + (void) sprintf(server_path, "%s%ld", namednodename, (long)getpid()); } + free (namednodename); if (stat(server_path, &filestat) < 0 ) { PRMSG(1,"NAMEDOpenClient: No device %s for NAMED connection\n", server_path, 0,0 ); @@ -701,34 +709,39 @@ char server_path[64]; struct stat sbuf; int mode; + char *namednodename; #endif - + char *x_streams_dir; PRMSG(2,"NAMEDOpenServer(%s)\n", port, 0,0 ); #if !defined(NAMEDNODENAME) PRMSG(1,"NAMEDOpenServer: Protocol is not supported by a NAMED connection\n", 0,0,0); return -1; #else + namednodename = MakeTempPathFromTmpString (NAMEDNODENAME); if ( port && *port ) { if( *port == '/' ) { /* A full pathname */ (void) sprintf(server_path, "%s", port); } else { - (void) sprintf(server_path, "%s%s", NAMEDNODENAME, port); + (void) sprintf(server_path, "%s%s", namednodename, port); } } else { - (void) sprintf(server_path, "%s%ld", NAMEDNODENAME, (long)getpid()); + (void) sprintf(server_path, "%s%ld", namednodename, (long)getpid()); } - + free (namednodename); #ifdef HAS_STICKY_DIR_BIT mode = 01777; #else mode = 0777; #endif - if (trans_mkdir(X_STREAMS_DIR, mode) == -1) { + x_streams_dir = MakeTempPathFromTmpString (X_STREAMS_DIR); + if (trans_mkdir(x_streams_dir, mode) == -1) { PRMSG (1, "NAMEDOpenServer: mkdir(%s) failed, errno = %d\n", - X_STREAMS_DIR, errno, 0); + x_streams_dir, errno, 0); + free (x_streams_dir); return(-1); } + free (x_streams_dir); if(stat(server_path, &sbuf) != 0) { if (errno == ENOENT) { @@ -910,14 +923,16 @@ mode_t spmode; struct stat filestat; #endif - + char *isctmpnodename; PRMSG(2,"ISCOpenClient(%s)\n", port, 0,0 ); #if !defined(ISCDEVNODENAME) PRMSG(1,"ISCOpenClient: Protocol is not supported by a ISC connection\n", 0,0,0); return -1; #else - (void) sprintf(server_path, ISCTMPNODENAME, port); + isctmpnodename = MakeTempPathFromTmpString (ISCTMPNODENAME); + (void) sprintf(server_path, isctmpnodename, port); + free (isctmpnodename); (void) sprintf(server_dev_path, ISCDEVNODENAME, port); fd = fds = server = -1; @@ -1021,7 +1036,9 @@ char server_path[64],server_unix_path[64]; unsigned int mode = 0; #endif - + char *x_streams_dir; + char *isctmpnodename; + char *x_unix_dir; PRMSG(2,"ISCOpenServer(%s)\n", port, 0,0 ); #if !defined(ISCDEVNODENAME) @@ -1029,7 +1046,9 @@ return -1; #else (void) sprintf(server_path, ISCDEVNODENAME, port); - (void) sprintf(server_unix_path, ISCTMPNODENAME, port); + isctmpnodename = MakeTempPathFromTmpString (ISCTMPNODENAME); + (void) sprintf(server_unix_path, isctmpnodename, port); + free (isctmpnodename); #ifdef HAS_STICKY_DIR_BIT mode = 01777; @@ -1038,11 +1057,14 @@ #endif /* "/dev/X" */ - if (trans_mkdir(X_STREAMS_DIR, mode) == -1) { + x_streams_dir = MakeTempPathFromTmpString (X_STREAMS_DIR); + if (trans_mkdir(x_streams_dir, mode) == -1) { PRMSG (1, "ISCOpenServer: mkdir(%s) failed, errno = %d\n", - X_STREAMS_DIR, errno, 0); + x_streams_dir, errno, 0); + free (x_streams_dir); return(-1); } + free (x_streams_dir); /* "/dev/X/ISCCONN" */ if (trans_mkdir(X_ISC_DIR, mode) == -1) { PRMSG (1, "ISCOpenServer: mkdir(%s) failed, errno = %d\n", @@ -1072,13 +1094,14 @@ * device to the path /tmp/.X11-unix/X path. */ #define X_UNIX_DIR "/tmp/.X11-unix" - - if (trans_mkdir(X_UNIX_DIR, mode) == -1) { + x_unix_dir = MakeTempPathFromTmpString (X_UNIX_DIR); + if (trans_mkdir(x_unix_dir, mode) == -1) { PRMSG (1, "ISCOpenServer: mkdir(%s) failed, errno = %d\n", - X_UNIX_DIR, errno, 0); + x_unix_dir, errno, 0); + free (x_unix_dir); return(-1); } - + free (x_unix_dir); unlink(server_unix_path); #ifdef SVR4 @@ -1486,6 +1509,7 @@ { #ifdef NAMEDNODENAME char server_path[64]; + char *namednodename; #endif PRMSG(2,"NAMEDReopenServer(%s)\n", port, 0,0 ); @@ -1494,16 +1518,17 @@ PRMSG(1,"NAMEDReopenServer: Protocol is not supported by a NAMED connection\n", 0,0,0); return 0; #else + namednodename = MakeTempPathFromTmpString (NAMEDNODENAME); if ( port && *port ) { if( *port == '/' ) { /* A full pathname */ (void) sprintf(server_path, "%s", port); } else { - (void) sprintf(server_path, "%s%s", NAMEDNODENAME, port); + (void) sprintf(server_path, "%s%s", namednodename, port); } } else { - (void) sprintf(server_path, "%s%ld", NAMEDNODENAME, (long)getpid()); + (void) sprintf(server_path, "%s%ld", namednodename, (long)getpid()); } - + free (namednodename); if (TRANS(FillAddrInfo) (ciptr, server_path, server_path) == 0) { PRMSG(1,"NAMEDReopenServer: failed to fill in addr info\n", @@ -1525,7 +1550,7 @@ #ifdef ISCDEVNODENAME char server_path[64], server_unix_path[64]; #endif - + char *isctmpnodename; PRMSG(2,"ISCReopenServer(%s)\n", port, 0,0 ); #if !defined(ISCDEVNODENAME) @@ -1533,8 +1558,9 @@ return 0; #else (void) sprintf(server_path, ISCDEVNODENAME, port); + isctmpnodename = MakeTempPathFromTmpString (ISCTMPNODENAME); (void) sprintf(server_unix_path, ISCTMPNODENAME, port); - + free (isctmpnodename); if (TRANS(FillAddrInfo) (ciptr, server_path, server_path) == 0) { PRMSG(1, "ISCReopenServer: failed to fill in addr info\n", 0,0,0); --- XFree86-4.3.0/xc/lib/xtrans/Xtranssock.c.xtmppath 2002-11-25 20:12:30.000000000 -0500 +++ XFree86-4.3.0/xc/lib/xtrans/Xtranssock.c 2003-04-09 15:16:48.000000000 -0400 @@ -128,6 +128,8 @@ #undef SO_DONTLINGER #endif +#include + #if defined(__UNIXOS2__) #if defined(NOT_EMX09A) static int IBMsockInit = 0; @@ -915,7 +917,8 @@ int oldUmask; int status; unsigned int mode; - + char *unix_dir; + char *unix_path; PRMSG (2, "SocketUNIXCreateListener(%s)\n", port ? port : "NULL", 0, 0); @@ -929,25 +932,30 @@ #else mode = 0777; #endif - if (trans_mkdir(UNIX_DIR, mode) == -1) { + unix_dir = MakeTempPathFromTmpString (UNIX_DIR); + if (trans_mkdir(unix_dir, mode) == -1) { PRMSG (1, "SocketUNIXCreateListener: mkdir(%s) failed, errno = %d\n", - UNIX_DIR, errno, 0); + unix_dir, errno, 0); (void) umask (oldUmask); + free (unix_dir); return TRANS_CREATE_LISTENER_FAILED; } + free (unix_dir); #endif sockname.sun_family = AF_UNIX; - + unix_path = MakeTempPathFromTmpString (UNIX_PATH); if (port && *port) { - if (set_sun_path(port, UNIX_PATH, sockname.sun_path) != 0) { + + if (set_sun_path(port, unix_path, sockname.sun_path) != 0) { PRMSG (1, "SocketUNIXCreateListener: path too long\n", 0, 0, 0); + free (unix_path); return TRANS_CREATE_LISTENER_FAILED; } } else { - sprintf (sockname.sun_path, "%s%ld", UNIX_PATH, (long)getpid()); + sprintf (sockname.sun_path, "%s%ld", unix_path, (long)getpid()); } - + free (unix_path); #if defined(BSD44SOCKETS) && !defined(Lynx) sockname.sun_len = strlen(sockname.sun_path); namelen = SUN_LEN(&sockname); @@ -1007,13 +1015,14 @@ struct stat statb; int status = TRANS_RESET_NOOP; unsigned int mode; + char *unix_dir; PRMSG (3, "SocketUNIXResetListener(%x,%d)\n", ciptr, ciptr->fd, 0); if (stat (unsock->sun_path, &statb) == -1 || ((statb.st_mode & S_IFMT) != #if (defined (sun) && defined(SVR4)) || defined(NCR) || defined(SCO) || defined(sco) || !defined(S_IFSOCK) - S_IFIFO)) + S_IFIFO)) #else S_IFSOCK)) #endif @@ -1026,12 +1035,15 @@ #else mode = 0777; #endif - if (trans_mkdir(UNIX_DIR, mode) == -1) { + unix_dir = MakeTempPathFromTmpString (UNIX_DIR); + if (trans_mkdir(unix_dir, mode) == -1) { PRMSG (1, "SocketUNIXResetListener: mkdir(%s) failed, errno = %d\n", - UNIX_DIR, errno, 0); + unix_dir, errno, 0); (void) umask (oldUmask); + free (unix_dir); return TRANS_RESET_FAILURE; } + free (unix_dir); #endif close (ciptr->fd); @@ -1556,7 +1568,7 @@ struct sockaddr_un old_sockname; int old_namelen; #endif - + char *unix_path; PRMSG (2,"SocketUNIXConnect(%d,%s,%s)\n", ciptr->fd, host, port); @@ -1594,10 +1606,13 @@ sockname.sun_family = AF_UNIX; - if (set_sun_path(port, UNIX_PATH, sockname.sun_path) != 0) { + unix_path = MakeTempPathFromTmpString (UNIX_PATH); + if (set_sun_path(port, unix_path, sockname.sun_path) != 0) { PRMSG (1, "SocketUNIXConnect: path too long\n", 0, 0, 0); + free (unix_path); return TRANS_CONNECT_FAILED; } + free (unix_path); #if defined(BSD44SOCKETS) && !defined(Lynx) sockname.sun_len = strlen (sockname.sun_path); --- XFree86-4.3.0/xc/lib/xtrans/Xtransutil.c.xtmppath 2003-04-09 15:16:47.000000000 -0400 +++ XFree86-4.3.0/xc/lib/xtrans/Xtransutil.c 2003-04-09 15:16:48.000000000 -0400 @@ -510,3 +510,30 @@ } #endif /* TRANS_SERVER */ + + +/* takes a string like /tmp/foo and turns it into TempPath/foo + */ +static char * +MakeTempPathFromTmpString(const char *path) +{ + const char *xtmppath; + + if (getuid() != 0) + return strdup (path); + + xtmppath = getenv ("XTMPPATH"); + + if (xtmppath == NULL) + return strdup (path); + + if (!strncmp ("/tmp", path, strlen ("/tmp"))) { + char *new_path; + new_path = malloc (strlen (xtmppath) + strlen (path) + 1 - strlen ("/tmp")); + sprintf (new_path, "%s%s", xtmppath, path + strlen ("/tmp")); + return new_path; + } else { + return strdup (path); + } +} + --- XFree86-4.3.0/xc/programs/Xserver/dix/main.c.xtmppath 2003-02-17 11:55:31.000000000 -0500 +++ XFree86-4.3.0/xc/programs/Xserver/dix/main.c 2003-04-09 15:16:48.000000000 -0400 @@ -245,6 +245,7 @@ { int i, j, k, error; char *xauthfile; + char *tmp_path; HWEventQueueType alwaysCheckForInput[2]; display = "0"; @@ -278,6 +279,7 @@ * can't be passed argc, argv as parameters */ argcGlobal = argc; argvGlobal = argv; + /* prep X authority file from environment; this can be overriden by a * command line option */ xauthfile = getenv("XAUTHORITY"); --- XFree86-4.3.0/xc/programs/Xserver/include/os.h.xtmppath 2002-12-24 12:42:59.000000000 -0500 +++ XFree86-4.3.0/xc/programs/Xserver/include/os.h 2003-04-09 15:16:48.000000000 -0400 @@ -584,6 +584,12 @@ extern void CheckUserParameters(int argc, char **argv, char **envp); extern void CheckUserAuthorization(void); +extern char *MakeTempPathFromTmpString( +#if NeedFunctionPrototypes + const char * /* path */ +#endif + ); + extern int AddHost( #if NeedFunctionPrototypes ClientPtr /*client*/, --- XFree86-4.3.0/xc/programs/Xserver/os/utils.c.xtmppath 2002-12-24 12:43:00.000000000 -0500 +++ XFree86-4.3.0/xc/programs/Xserver/os/utils.c 2003-04-09 16:11:17.000000000 -0400 @@ -247,12 +247,13 @@ * Path names */ #ifndef __UNIXOS2__ - tmppath = LOCK_DIR; + tmppath = MakeTempPathFromTmpString (LOCK_DIR); #else /* OS/2 uses TMP directory, must also prepare for 8.3 names */ tmppath = getenv("TMP"); if (!tmppath) FatalError("No TMP dir found\n"); + #endif len = strlen(LOCK_PREFIX) > strlen(LOCK_TMP_PREFIX) ? strlen(LOCK_PREFIX) : @@ -263,6 +264,10 @@ (void)sprintf(tmp, "%s" LOCK_TMP_PREFIX "%s" LOCK_SUFFIX, tmppath, display); (void)sprintf(LockFile, "%s" LOCK_PREFIX "%s" LOCK_SUFFIX, tmppath, display); +#ifndef __UNIXOS2__ + Xfree (tmppath); +#endif + /* * Create a temporary file containing our PID. Attempt three times * to create the file. @@ -2048,3 +2053,29 @@ } #endif } + + +/* takes a string like /tmp/foo and turns it into TempPath/foo + */ +char * +MakeTempPathFromTmpString(const char *path) +{ + const char *xtmppath; + + if (getuid() != 0) + return strdup (path); + + xtmppath = getenv ("XTMPPATH"); + + if (xtmppath == NULL) + return strdup (path); + + if (!strncmp ("/tmp", path, strlen ("/tmp"))) { + char *new_path; + new_path = malloc (strlen (xtmppath) + strlen (path) + 1 - strlen ("/tmp")); + sprintf (new_path, "%s%s", xtmppath, path + strlen ("/tmp")); + return new_path; + } else { + return strdup (path); + } +}