There are 2 potential overflows in xtrans, which may be exploitable.
One of them is documented in <http://www.securityfocus.com/archive/1/139436>

Apply by doing:
       cd "the directory containing your X11 source dir"
       patch -p0 < 030_xtrans.patch

And then rebuild your X11 tree:
       cd X11
       make build "DESTDIR=/"

Note: tcl/tk 8.0.5 is required to build X11 from source.

Index: X11/xc/lib/xtrans/Xtrans.c
===================================================================
RCS file: /cvs/X11/xc/lib/xtrans/Xtrans.c,v
retrieving revision 1.1.1.3
retrieving revision 1.2
diff -u -u -r1.1.1.3 -r1.2
--- X11/xc/lib/xtrans/Xtrans.c  1999/08/24 17:41:25     1.1.1.3
+++ X11/xc/lib/xtrans/Xtrans.c  2000/10/14 15:47:31     1.2
@@ -178,7 +178,7 @@
     * a case insensitive match.
     */

-    strncpy (protobuf, protocol, PROTOBUFSIZE);
+    strncpy (protobuf, protocol, PROTOBUFSIZE - 1);

    for (i = 0; i < PROTOBUFSIZE && protobuf[i] != '\0'; i++)
       if (isupper (protobuf[i]))
Index: X11/xc/lib/xtrans/Xtranssock.c
===================================================================
RCS file: /cvs/X11/xc/lib/xtrans/Xtranssock.c,v
retrieving revision 1.4
retrieving revision 1.6
diff -u -u -r1.4 -r1.6
--- X11/xc/lib/xtrans/Xtranssock.c      1999/08/24 18:11:21     1.4
+++ X11/xc/lib/xtrans/Xtranssock.c      2000/10/13 21:04:23     1.6
@@ -754,6 +754,29 @@
}


+#ifdef UNIXCONN
+static int
+set_sun_path(const char *port, const char *upath, char *path)
+{
+    struct sockaddr_un s;
+    int maxlen = sizeof(s.sun_path) - 1;
+
+    if (!port || !*port || !path)
+       return -1;
+
+    if (*port == '/') { /* a full pathname */
+       if (strlen(port) > maxlen)
+           return -1;
+       sprintf(path, "%s", port);
+    } else {
+       if (strlen(port) + strlen(upath) > maxlen)
+           return -1;
+       sprintf(path, "%s%s", upath, port);
+    }
+    return 0;
+}
+#endif
+
#ifdef TRANS_SERVER

static int
@@ -957,10 +980,9 @@
    sockname.sun_family = AF_UNIX;

    if (port && *port) {
-       if (*port == '/') { /* a full pathname */
-           sprintf (sockname.sun_path, "%s", port);
-       } else {
-           sprintf (sockname.sun_path, "%s%s", UNIX_PATH, port);
+       if (set_sun_path(port, UNIX_PATH, sockname.sun_path) != 0) {
+           PRMSG (1, "SocketUNIXCreateListener: path too long\n", 0, 0, 0);
+           return TRANS_CREATE_LISTENER_FAILED;
       }
    } else {
       sprintf (sockname.sun_path, "%s%d", UNIX_PATH, getpid());
@@ -1604,10 +1626,9 @@

    sockname.sun_family = AF_UNIX;

-    if (*port == '/') { /* a full pathname */
-       sprintf (sockname.sun_path, "%s", port);
-    } else {
-       sprintf (sockname.sun_path, "%s%s", UNIX_PATH, port);
+    if (set_sun_path(port, UNIX_PATH, sockname.sun_path) != 0) {
+       PRMSG (1, "SocketUNIXCreateListener: path too long\n", 0, 0, 0);
+       return TRANS_CREATE_LISTENER_FAILED;
    }

#if defined(BSD44SOCKETS) && !defined(Lynx)
@@ -1623,10 +1644,9 @@
     * This is gross, but it was in Xlib
     */
    old_sockname.sun_family = AF_UNIX;
-    if (*port == '/') { /* a full pathname */
-       sprintf (old_sockname.sun_path, "%s", port);
-    } else {
-       sprintf (old_sockname.sun_path, "%s%s", OLD_UNIX_PATH, port);
+    if (set_sun_path(port, OLD_UNIX_PATH, old_sockname.sun_path) != 0) {
+       PRMSG (1, "SocketUNIXConnect: path too long\n", 0, 0, 0);
+       return TRANS_CONNECT_FAILED;
    }
    old_namelen = strlen (old_sockname.sun_path) +
       sizeof (old_sockname.sun_family);