diff options
author | Aaron Plattner <aplattner@nvidia.com> | 2010-08-15 21:51:38 -0700 |
---|---|---|
committer | Aaron Plattner <aplattner@nvidia.com> | 2010-08-19 06:44:50 -0700 |
commit | f92e754297ec5fdb81068b56a4435026666224fa (patch) | |
tree | 6322d8ef4d55c0637973c34c3b3b6b96f6818e5f | |
parent | 1dc401f678469d0235e6d0b28eb4356f03327c9f (diff) |
XOpenDisplay: save the correct display_name value
The X Test Suite's XDisplayString test checks the invariant
XDisplayString(XOpenDisplay(str)) == str. The Xlib XOpenDisplay violates this
invariant by expanding str to the canonical form "host:display.scrn" (unless
HAVE_LAUNCHD is set and it starts with "/tmp/launch"). E.g., this expands ":1"
to ":1.0":
400|26 1 1 19:26:41|IC Start
200|26 1 19:26:41|TP Start
520|26 1 00032625 1 1|VSW5TESTSUITE PURPOSE 1
520|26 1 00032625 1 2|Assertion XDisplayString-1.(A)
520|26 1 00032625 1 3|A call to XDisplayString returns the string that was used
520|26 1 00032625 1 4|as the argument to the XOpenDisplay call that returned the
520|26 1 00032625 1 5|value used as the display argument.
520|26 1 00032625 1 6|METH: Open a connection using XOpenDisplay.
520|26 1 00032625 1 7|METH: Obtain the display string using XDisplayString.
520|26 1 00032625 1 8|METH: Verify that the value of the string is the parameter used in XOpenDisplay.
520|26 1 00032625 1 9|METH: Close the display using XCloseDisplay.
520|26 1 00032625 1 10|REPORT: XDisplayString() returned ":1.0" instead of ":1".
220|26 1 1 19:26:41|FAIL
410|26 1 1 19:26:41|IC End
Fix this by deleting all of the code to construct the canonical path and just
stashing a copy of the original display_name in dpy->display_name.
Signed-off-by: Aaron Plattner <aplattner@nvidia.com>
Reviewed-by: Jeremy Huddleston <jeremyhu@apple.com>
-rw-r--r-- | src/OpenDis.c | 20 | ||||
-rw-r--r-- | src/Xxcbint.h | 2 | ||||
-rw-r--r-- | src/xcb_disp.c | 18 |
3 files changed, 13 insertions, 27 deletions
diff --git a/src/OpenDis.c b/src/OpenDis.c index 8de95569..e568a30e 100644 --- a/src/OpenDis.c +++ b/src/OpenDis.c @@ -69,7 +69,6 @@ XOpenDisplay ( int j, k; /* random iterator indexes */ char *display_name; /* pointer to display name */ char *setup = NULL; /* memory allocated at startup */ - char *fullname = NULL; /* expanded name of display */ int iscreen; /* screen number */ xConnSetupPrefix prefix; /* prefix information */ int vendorlen; /* length of vendor string */ @@ -117,13 +116,17 @@ XOpenDisplay ( return(NULL); } + if ((dpy->display_name = strdup(display_name)) == NULL) { + OutOfMemory(dpy); + return(NULL); + } + /* * Call the Connect routine to get the transport connection object. - * If NULL is returned, the connection failed. The connect routine - * will set fullname to point to the expanded name. + * If NULL is returned, the connection failed. */ - if(!_XConnectXCB(dpy, display, &fullname, &iscreen)) { + if(!_XConnectXCB(dpy, display, &iscreen)) { /* Try falling back on other transports if no transport specified */ const char *slash = strrchr(display_name, '/'); if(slash == NULL) { @@ -135,14 +138,13 @@ XOpenDisplay ( if(buf) { for(s = protocols; buf && *s; s++) { snprintf(buf, buf_size, "%s/%s", *s, display_name); - if(_XConnectXCB(dpy, buf, &fullname, &iscreen)) + if(_XConnectXCB(dpy, buf, &iscreen)) goto fallback_success; } Xfree(buf); } } - dpy->display_name = fullname; OutOfMemory(dpy); return NULL; } @@ -152,7 +154,6 @@ fallback_success: * Initialize pointers to NULL so that XFreeDisplayStructure will * work if we run out of memory before we finish initializing. */ - dpy->display_name = fullname; dpy->keysyms = (KeySym *) NULL; dpy->modifiermap = NULL; dpy->lock_meaning = NoSymbol; @@ -314,7 +315,7 @@ fallback_success: if (!mask) { fprintf (stderr, "Xlib: connection to \"%s\" invalid setup\n", - fullname); + dpy->display_name); OutOfMemory(dpy); return (NULL); } @@ -678,8 +679,7 @@ void _XFreeDisplayStructure(Display *dpy) Xfree ((char *)dpy->pixmap_format); } - if (dpy->display_name) - Xfree (dpy->display_name); + free(dpy->display_name); if (dpy->vendor) Xfree (dpy->vendor); diff --git a/src/Xxcbint.h b/src/Xxcbint.h index c8191620..1fa1a4d7 100644 --- a/src/Xxcbint.h +++ b/src/Xxcbint.h @@ -40,7 +40,7 @@ typedef struct _X11XCBPrivate { /* xcb_disp.c */ -int _XConnectXCB(Display *dpy, _Xconst char *display, char **fullnamep, int *screenp); +int _XConnectXCB(Display *dpy, _Xconst char *display, int *screenp); void _XFreeX11XCBStructure(Display *dpy); #endif /* XXCBINT_H */ diff --git a/src/xcb_disp.c b/src/xcb_disp.c index 690a6036..0fa40dea 100644 --- a/src/xcb_disp.c +++ b/src/xcb_disp.c @@ -54,11 +54,10 @@ void XSetAuthorization(char *name, int namelen, char *data, int datalen) _XUnlockMutex(_Xglobal_lock); } -int _XConnectXCB(Display *dpy, _Xconst char *display, char **fullnamep, int *screenp) +int _XConnectXCB(Display *dpy, _Xconst char *display, int *screenp) { char *host; int n = 0; - int len; xcb_connection_t *c; dpy->fd = -1; @@ -69,20 +68,7 @@ int _XConnectXCB(Display *dpy, _Xconst char *display, char **fullnamep, int *scr if(!xcb_parse_display(display, &host, &n, screenp)) return 0; - - len = strlen(host) + (1 + 20 + 1 + 20 + 1); - *fullnamep = Xmalloc(len); - if (!*fullnamep) { - free(host); - return 0; - } - -#ifdef HAVE_LAUNCHD - if(strncmp(host, "/tmp/launch", 11) == 0) - snprintf(*fullnamep, len, "%s:%d", host, n); - else -#endif - snprintf(*fullnamep, len, "%s:%d.%d", host, n, *screenp); + /* host and n are unused, but xcb_parse_display requires them */ free(host); _XLockMutex(_Xglobal_lock); |