Accepting request 760659 from home:gmbr3:branches:X11:XOrg

- Update 1.13.1
  * u_don-t-flag-extra-reply-in-xcb_take_socket.patch has been upstreamed.

OBS-URL: https://build.opensuse.org/request/show/760659
OBS-URL: https://build.opensuse.org/package/show/X11:XOrg/libxcb?expand=0&rev=57
This commit is contained in:
Stefan Dirsch 2020-01-04 22:02:17 +00:00 committed by Git OBS Bridge
parent 9e93ef09c5
commit 1ae51e0ba9
5 changed files with 15 additions and 108 deletions

3
libxcb-1.13.1.tar.bz2 Normal file
View File

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:a89fb7af7a11f43d2ce84a844a4b38df688c092bf4b67683aef179cdf2a647c4
size 506778

View File

@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:188c8752193c50ff2dbe89db4554c63df2e26a2e47b0fa415a70918b5b851daa
size 510453

View File

@ -1,3 +1,10 @@
-------------------------------------------------------------------
Fri Jan 3 12:22:59 UTC 2020 - Chocy Orange <callumjfarmer13@gmail.com>
- Update 1.13.1
* u_don-t-flag-extra-reply-in-xcb_take_socket.patch has been upstreamed.
-------------------------------------------------------------------
Tue Aug 21 06:58:35 UTC 2018 - msrb@suse.com

View File

@ -1,7 +1,7 @@
#
# spec file for package libxcb
#
# Copyright (c) 2018 SUSE LINUX GmbH, Nuernberg, Germany.
# Copyright (c) 2020 SUSE LINUX GmbH, Nuernberg, Germany.
#
# All modifications and additions to the file contributed by third parties
# remain the property of their copyright owners, unless otherwise agreed
@ -12,7 +12,7 @@
# license that conforms to the Open Source Definition (Version 1.9)
# published by the Open Source Initiative.
# Please submit bugfixes or comments via http://bugs.opensuse.org/
# Please submit bugfixes or comments via https://bugs.opensuse.org/
#
@ -23,20 +23,19 @@
%bcond_without python2
%endif
Name: libxcb
Version: 1.13
Version: 1.13.1
Release: 0
Summary: X11 core protocol C library
License: MIT
Group: Development/Libraries/C and C++
Url: http://xcb.freedesktop.org/
#Git-Clone: git://anongit.freedesktop.org/xcb/libxcb
#Git-Web: http://cgit.freedesktop.org/xcb/libxcb/
#DL-URL: http://xcb.freedesktop.org/dist/
#Git-Web: https://cgit.freedesktop.org/xcb/libxcb/
#DL-URL: https://xcb.freedesktop.org/dist/
Source: %{name}-%{version}.tar.bz2
Source1: baselibs.conf
Patch1: bug-262309_xcb-xauthlocalhostname.diff
Patch2: n_If-auth-with-credentials-for-hostname-fails-retry-with-XAUTHLOCALHOSTNAME.patch
Patch3: u_don-t-flag-extra-reply-in-xcb_take_socket.patch
BuildRequires: autoconf >= 2.57
BuildRequires: automake
BuildRequires: libtool
@ -391,7 +390,6 @@ libxcb.
%setup -q
%patch1
%patch2 -p1
%patch3 -p1
%build
./autogen.sh

View File

@ -1,98 +0,0 @@
Author: Erik Kurzinger <ekurzinger@nvidia.com>
Subject: don't flag extra reply in xcb_take_socket
Patch-Mainline: To-be-upstreamed
Signed-off-by: Michal Srb <msrb@suse.com>
References: bnc#1101560
If any flags are specified in a call to xcb_take_socket,
they should only be applied to replies for requests sent
after that function returns (and until the socket is
re-acquired by XCB).
Previously, they would also be incorrectly applied to the
reply for the last request sent before the socket was taken.
For instance, in this example program the reply for the
GetInputFocus request gets discarded, even though it was
sent before the socket was taken. This results in the
call to retrieve the reply hanging indefinitely.
static void return_socket(void *closure) {}
int main(void)
{
Display *dpy = XOpenDisplay(NULL);
xcb_connection_t *c = XGetXCBConnection(dpy);
xcb_get_input_focus_cookie_t cookie = xcb_get_input_focus_unchecked(c);
xcb_flush(c);
uint64_t seq;
xcb_take_socket(c, return_socket, dpy, XCB_REQUEST_DISCARD_REPLY, &seq);
xcb_generic_error_t *err;
xcb_get_input_focus_reply(c, cookie, &err);
}
In practice, this has been causing intermittent KWin crashes when
used in combination with the proprietary NVIDIA driver such as
https://bugs.kde.org/show_bug.cgi?id=386370 since when Xlib fails to
retrieve one of these incorrectly discarded replies it triggers
an IO error.
Signed-off-by: Erik Kurzinger <ekurzinger@nvidia.com>
---
src/xcb_in.c | 21 +++++++++++++++++++--
src/xcb_out.c | 10 ++++++++--
2 files changed, 27 insertions(+), 4 deletions(-)
diff --git a/src/xcb_in.c b/src/xcb_in.c
index 73209e0..4333ad3 100644
--- a/src/xcb_in.c
+++ b/src/xcb_in.c
@@ -958,8 +958,20 @@ void _xcb_in_replies_done(xcb_connection_t *c)
pend = container_of(c->in.pending_replies_tail, struct pending_reply, next);
if(pend->workaround == WORKAROUND_EXTERNAL_SOCKET_OWNER)
{
- pend->last_request = c->out.request;
- pend->workaround = WORKAROUND_NONE;
+ if (XCB_SEQUENCE_COMPARE(pend->first_request, <=, c->out.request)) {
+ pend->last_request = c->out.request;
+ pend->workaround = WORKAROUND_NONE;
+ } else {
+ /* The socket was taken, but no requests were actually sent
+ * so just discard the pending_reply that was created.
+ */
+ struct pending_reply **prev_next = &c->in.pending_replies;
+ while (*prev_next != pend)
+ prev_next = &(*prev_next)->next;
+ *prev_next = NULL;
+ c->in.pending_replies_tail = prev_next;
+ free(pend);
+ }
}
}
}
diff --git a/src/xcb_out.c b/src/xcb_out.c
index 3601a5f..c9593e5 100644
--- a/src/xcb_out.c
+++ b/src/xcb_out.c
@@ -387,8 +387,14 @@ int xcb_take_socket(xcb_connection_t *c, void (*return_socket)(void *closure), v
{
c->out.return_socket = return_socket;
c->out.socket_closure = closure;
- if(flags)
- _xcb_in_expect_reply(c, c->out.request, WORKAROUND_EXTERNAL_SOCKET_OWNER, flags);
+ if(flags) {
+ /* c->out.request + 1 will be the first request sent by the external
+ * socket owner. If the socket is returned before this request is sent
+ * it will be detected in _xcb_in_replies_done and this pending_reply
+ * will be discarded.
+ */
+ _xcb_in_expect_reply(c, c->out.request + 1, WORKAROUND_EXTERNAL_SOCKET_OWNER, flags);
+ }
assert(c->out.request == c->out.request_written);
*sent = c->out.request;
}
--
2.16.4