@@ -980,14 +980,23 @@ static void process_xevent_configure(Ghandles * g, XID window,
980
980
send_pixmap_grant_refs (g , window );
981
981
}
982
982
983
- static void send_clipboard_data (libvchan_t * vchan , XID window , char * data , uint32_t len )
983
+ static void send_clipboard_data (libvchan_t * vchan , XID window , char * data , uint32_t len , int protocol_version )
984
984
{
985
985
struct msg_hdr hdr ;
986
986
hdr .type = MSG_CLIPBOARD_DATA ;
987
987
hdr .window = window ;
988
988
if (len > MAX_CLIPBOARD_SIZE )
989
989
{
990
- len = MAX_CLIPBOARD_SIZE ;
990
+ if (protocol_version >= QUBES_GUID_MIN_CLIPBOARD_4X ) {
991
+ // xside is capable of receiving (up to) 4X of the previous size.
992
+ // it is also smarter. send one byte over the Maximum limit.
993
+ // A simple sign for xside to reject it.
994
+ len = MAX_CLIPBOARD_SIZE + 1 ;
995
+ } else {
996
+ // The dumb case. Truncate the data to the old size. User will lose
997
+ // some inter-vm clipboard data without being notified.
998
+ len = 65000 ;
999
+ }
991
1000
}
992
1001
hdr .untrusted_len = len ;
993
1002
write_struct (vchan , hdr );
@@ -1052,7 +1061,7 @@ static void process_xevent_selection(Ghandles * g, XSelectionEvent * ev)
1052
1061
g -> utf8_string_atom , g -> qprop ,
1053
1062
g -> stub_win , ev -> time );
1054
1063
else
1055
- send_clipboard_data (g -> vchan , g -> stub_win , (char * ) data , len );
1064
+ send_clipboard_data (g -> vchan , g -> stub_win , (char * ) data , len , g -> protocol_version );
1056
1065
/* even if the clipboard owner does not support UTF8 and we requested
1057
1066
XA_STRING, it is fine - ascii is legal UTF8 */
1058
1067
XFree (data );
@@ -2097,7 +2106,7 @@ static void handle_clipboard_req(Ghandles * g, XID winid)
2097
2106
fprintf (stderr , "clipboard req, owner=0x%x\n" ,
2098
2107
(int ) owner );
2099
2108
if (owner == None ) {
2100
- send_clipboard_data (g -> vchan , winid , NULL , 0 );
2109
+ send_clipboard_data (g -> vchan , winid , NULL , 0 , g -> protocol_version );
2101
2110
return ;
2102
2111
}
2103
2112
XConvertSelection (g -> display , Clp , g -> targets , g -> qprop , g -> stub_win , g -> time );
0 commit comments