ports/156542: [PATCH] x11/rxvt: don't crash on paste from non-ICCCM clients
Marcin Cieslak
saper at saper.info
Thu Apr 21 08:30:12 UTC 2011
>Number: 156542
>Category: ports
>Synopsis: [PATCH] x11/rxvt: don't crash on paste from non-ICCCM clients
>Confidential: no
>Severity: serious
>Priority: low
>Responsible: freebsd-ports-bugs
>State: open
>Quarter:
>Keywords:
>Date-Required:
>Class: change-request
>Submitter-Id: current-users
>Arrival-Date: Thu Apr 21 08:30:11 UTC 2011
>Closed-Date:
>Last-Modified:
>Originator: Marcin Cieslak
>Release: FreeBSD 9.0-CURRENT amd64
>Organization:
http://saper.info
>Environment:
System: FreeBSD radziecki.saper.info 9.0-CURRENT FreeBSD 9.0-CURRENT #1 r219785M: Mon Mar 21 11:40:40 CET
>Description:
Some clients that are sending NONE as property
in their ConvertSelection request:
............REQUEST: ConvertSelection
sequence number: 012c
request length: 0006
requestor: WIN 0260000d
selection: <PRIMARY>
target: <STRING>
property: <NONE>
time: CurrentTime
..............EVENT: SelectionRequest
sequence number: 0208
time: CurrentTime
owner: WIN 02400008
requestor: WIN 0260000d
selection: <PRIMARY>
target: <STRING>
property: <NONE>
..............ERROR: Atom
Receipt of SelectionRequest with <NONE> property
causes rxvt derivatives to crash with BadAtom error.
ICCCM says, that only obsolete clients should behave like this, and
t recommends that clients owning selection should use
the target atom as the property name.
(see http://tronche.com/gui/x/icccm/sec-2.html#s-2.2)
xterm is handling this, but rxvt and derivatives do not.
Submitted upstream:
(rxvt)
https://sourceforge.net/tracker/?func=detail&aid=3289852&group_id=221&atid=100221
(rxvt-unicode)
http://thread.gmane.org/gmane.comp.terminal-emulators.rxvt-unicode.general/958
Added file(s):
- files/patch-screen.c
Port maintainer (akosela at andykosela.com) is cc'd.
Generated with FreeBSD Port Tools 0.99
>How-To-Repeat:
Paste from rxvt into comms/syncterm or one of the clients
described in:
http://michael.toren.net/mirrors/doc/X-copy+paste.txt
>Fix:
--- rxvt-2.6.4_5.patch begins here ---
diff -ruN --exclude=CVS /usr/ports/x11/rxvt.orig/files/patch-screen.c /usr/ports/x11/rxvt/files/patch-screen.c
--- /usr/ports/x11/rxvt.orig/files/patch-screen.c 1970-01-01 01:00:00.000000000 +0100
+++ /usr/ports/x11/rxvt/files/patch-screen.c 2011-04-21 09:01:13.000000000 +0200
@@ -0,0 +1,52 @@
+--- src/screen.c.orig 2011-04-21 08:56:56.000000000 +0200
++++ src/screen.c 2011-04-21 08:59:19.000000000 +0200
+@@ -3359,6 +3359,7 @@
+ XEvent ev;
+ Atom32 target_list[4];
+ Atom target;
++ Atom property;
+ static Atom xa_targets = None;
+ static Atom xa_compound_text = None;
+ static Atom xa_text = None;
+@@ -3381,16 +3382,26 @@
+ ev.xselection.target = rq->target;
+ ev.xselection.time = rq->time;
+
++ /* ICCCM: 2.2. Responsibilities of the Selection Owner
++ * SelectionRequest:
++ * If the specified property is None , the requestor
++ * an obsolete client. Owners are encouraged
++ * to support these clients by using the specified
++ * target atom as the property name to be used for
++ * the reply.
++ */
++ property = (rq->property == 0) ? rq->target : rq->property;
++
+ if (rq->target == xa_targets) {
+ target_list[0] = (Atom32) xa_targets;
+ target_list[1] = (Atom32) XA_STRING;
+ target_list[2] = (Atom32) xa_text;
+ target_list[3] = (Atom32) xa_compound_text;
+- XChangeProperty(Xdisplay, rq->requestor, rq->property, rq->target,
++ XChangeProperty(Xdisplay, rq->requestor, property, rq->target,
+ (8 * sizeof(target_list[0])), PropModeReplace,
+ (unsigned char *)target_list,
+ (sizeof(target_list) / sizeof(target_list[0])));
+- ev.xselection.property = rq->property;
++ ev.xselection.property = property;
+ } else if (rq->target == XA_STRING
+ || rq->target == xa_compound_text
+ || rq->target == xa_text) {
+@@ -3404,10 +3415,10 @@
+ }
+ cl[0] = selection.text;
+ XmbTextListToTextProperty(Xdisplay, cl, 1, style, &ct);
+- XChangeProperty(Xdisplay, rq->requestor, rq->property,
++ XChangeProperty(Xdisplay, rq->requestor, property,
+ target, 8, PropModeReplace,
+ ct.value, ct.nitems);
+- ev.xselection.property = rq->property;
++ ev.xselection.property = property;
+ }
+ XSendEvent(Xdisplay, rq->requestor, False, 0, &ev);
+ }
--- rxvt-2.6.4_5.patch ends here ---
>Release-Note:
>Audit-Trail:
>Unformatted:
More information about the freebsd-ports-bugs
mailing list