Commit Graph

83 Commits

Author SHA1 Message Date
ilammy
93fc349ce6 client/X11: harden xf_cliprdr_parse_server_format_list()
* Make sure that numFormats has reasonable value

This will help catching errors like writing -1 as an unsigned number
of formats into the serialized stream, or trying to read the property
after someone else erroneosly messed with it, or other similar mistakes
which would result into reading and then sending garbage to the server.

We read the list xf_cliprdr_get_raw_server_formats() from an X window
property. Properties generally cannot be larger than 4 KB and each
format requires at least 5 bytes (most of them are named, though),
which gives us 512-ish limit on the number of formats we can squeeze
into the property.

However, it's hard to find an application that provides more than
20 formats (I've seen like 15 for MS Office apps), thus I believe
we can safely assume than anything that does not fit into a byte
means that we are reading garbage rather than a good format list.

* Check for the end of stream when reading format names

This also prevents reading garbage and getting segmentation faults
and Valgrind warnings when somebody somewhere sometimes forgets to
put a terminating null character where it belongs.

strnlen() and strndup() functions are provided by POSIX.1-2008
which we can reasonably expect to be available in 2016.
2016-02-23 01:20:34 +02:00
ilammy
7bce7ef372 client/X11: transfer raw clipboard format data
The second step of raw transfer is to transfer the format data itself.
This has been already implemented in XFreeRDP before, but several
tweaks are required for it to work correctly.

The idea of raw data transfer is to request for _FREERDP_RAW clipboard
format while putting the actual formatId into _FREERDP_CLIPRDR property
where the requested data is expected to arrive to. Then the clipboard
owner will check for the real formatId and deliver the expected data.

This stays true, but the check is performed in a more straightforward
way, and CF_RAW format (numerically equal to zero) is not considered
an unknown destination format when performing (identity) conversions
with wClipboard. This is not an issue because wClipboard will allow
only identity conversion for CF_RAW, it will fail if something else
is going to be converted into CF_RAW.
2015-11-14 19:03:10 +02:00
ilammy
391ed0d91d client/X11: transfer raw clipboard format lists
The first part of raw transfer sequence is to transfer the format
list of the session A into the session B. Then we will be able to
request/reply with raw data using proper format IDs.

xf_cliprdr_server_format_list() of the session A now exposes the
raw server format list. As soon as the list is received, it is
serialized and put into _FREERDP_CLIPRDR_FORMATS property.

xf_cliprdr_get_requested_targets() of the session B now checks
whether the clipboard owner is a FreeRDP session with enabled
raw transfer capability. If it is, the raw format list is simply
extracted from _FREERDP_CLIPRDR_FORMATS of the clipboard owner.
Otherwise, the format list is populated from the usual TARGETS
clipboard format.
2015-11-14 19:03:10 +02:00
ilammy
626e40a9c1 client/X11: add raw clipboard transfer indication
Some time ago there was a property _FREERDP_CLIPRDR_ID which was indended
to indicate that an XFreeRDP window owns a clipboard. This was necessary
for raw transfers. This property was used by xf_cliprdr_is_self_owned()
function. However, raw transfer support was broken and the meaning of
xf_cliprdr_is_self_owned() gradually changed into checking whether
the *current* window owns the clipboard, not just any XFreeRDP window.
Thus _FREERDP_CLIPRDR_ID was removed in a4580923e7 (xfreerdp/clipr:
fix self owned test and hardening).

However, now we are going to fix raw transfers and we need that property.
This patch reintroduces a similar property "_FREERDP_CLIPRDR_RAW" which
indicates that a window is an XFreeRDP window with enabled raw transfer.
It is currently used by xf_cliprdr_server_format_data_request() to
correctly request format data from another XFreeRDP instance via raw
transfer protocol.

This property can be queried from the clipboard owner with the function
xf_cliprdr_is_raw_transfer_available() and can be enabled or disabled
on the current window by xf_cliprdr_set_raw_transfer_enabled().

Disabling raw transfers will be necesary to correctly implement file
transfers in the future. However, currently raw transfers are always
enabled.
2015-11-14 19:03:10 +02:00
ilammy
532371d5aa client/X11: remove unused function
xf_cliprdr_send_data_request() is actually used instead of this one.
2015-11-14 19:03:10 +02:00
ilammy
46fb66e0fb client/X11: send clipboard format data errors correctly
xf_cliprdr_send_data_response() is consistently called with NULL
data pointer as a way to report errors, but it was not setting
the msgFlags field accordingly.
2015-11-14 19:03:10 +02:00
ilammy
d7c9a31b4b client/X11: correctly trim terminating null bytes from strings
Sometimes Windows sends strings with excess null terminating bytes.
For example, when one copies digits from calc.exe. At the same time,
some local applications freak out when they encounter null bytes
(at least LibreOffice is known to be replacing them with '#').

According to the specification of UTF8_STRING format [1], the string
data must not contain any trailing null bytes. So they all should be
trimmed, not only the last one.

Also, if the trailing null byte is not present, the length should not
be adjusted. For example, Firefox is actually sending "HTML Format"
without a null byte while Internet Explorer adds one. The spec for
text/html format [2] says nothing about the teminating null byte, so
we are free to remove it, but at least we should not mistakingly
delete '>' character of "</html>" tag when it is the last character.

[1] http://www.pps.univ-paris-diderot.fr/~jch/software/UTF8_STRING/UTF8_STRING.text

[2] https://www.ietf.org/rfc/rfc2854.txt
2015-11-14 19:03:10 +02:00
ilammy
b9a297379b client/X11: improve named clipboard format support
Clipboard formats are identified by numerical IDs and literal names.
We can keep using arbitrary defined IDs for local clipboard formats
as we are sure that they have some fixed meaning, but the server can
and will be using its own IDs, which can be different from ours for
the named formats.

Therefore:

1) A correct way to compare a local format to a remote one is
   to check the names first, and only then compare their IDs.
   (Extra care should be taken to support short format names.)

2) Server IDs cannot be used with wClipboard directly when dealing
   with named formats. Format name should be used to extract correct
   local ID for the use with Clipboard{Set,Get}Data().

Also, I find the notion of 'alternate' format IDs to be confusing.
We either deal with a fixed ID format (declared in <winpr/user.h>),
or a format that was given an arbitrary fixed ID for local use
(defined in <freerdp/channels/cliprdr.h>), or a remote format
identified by a pair of an ID and a name. Format IDs can be local
and remote, but there are no 'alternates'.

So now:

1) A new function xf_cliprdr_formats_equal() is used to compare
   formats correctly in xf_cliprdr_get_server_format_by_atom()
   when searching for a server format corresponding to a local
   one, and in xf_cliprdr_server_format_list() when constructing
   a local TARGETS list from the server format list.

2) Correct local format IDs are used with wClipboard conversions
   by xf_cliprdr_process_requested_data() and
   xf_cliprdr_server_format_data_response().

3) We refer to formatId and formatName when doing requests,
   and srcFormatId and dstFormatId when doing conversions,
   instead of using formatId and altFormatId for both purposes.

4) Server format ID and name are used to identify cached clipboard
   contents. The name is compared directly as a pointer because it
   will be a pointer from the same clipboard->serverFormats array.

   Also, the clipboard contents are invalidated when format list
   arrives, so xf_cliprdr_server_format_list() now also clears
   the format ID and name together with the data.
2015-11-14 19:03:10 +02:00
ilammy
8434709fc6 client/X11: improve clipboard format search functions
The functions now have appropriate names which tell what exactly
they are searching for:

    xf_cliprdr_get_client_format_by_id()
        Get a client-provided format by client-side ID.

    xf_cliprdr_get_client_format_by_atom()
        Get a client-provided format by client-side format name.

    xf_cliprdr_get_server_format_by_atom()
        Get a corresponding server format by client-side format name.

The return types of functions have been adjusted accordingly and
correct formats are now used everywhere without mixing them up:
client-side formats are used for client -> server data flow,
while server-side ones are used for server -> client tranfers.

This resolves the issue #1414 as, for some reason, xfreerdp required
server format list to be present to be able to provide its own client
formats. Actually, we need only client format list to provide these.

Also, CF_RAW special case is handled in a more elegant way: it is
assumed to be present in every server format list (which is true).
2015-11-14 19:03:10 +02:00
Norbert Federa
a4580923e7 xfreerdp/clipr: fix self owned test and hardening
- xf_cliprdr_is_self_owned() lied if multiple xfreerdp instances were
  running.
- fixed a few unchecked callocs
- added/modified and handled some return values in compliance with
  the new hardened channel api
2015-10-20 21:28:29 +02:00
Martin Haimberger
52405a3e79 Remove WIN32ERROR type
All return values are UINT now.
2015-08-27 05:38:20 -07:00
Martin Haimberger
6ab0187d84 Merge remote-tracking branch 'upstream/master' into mh-channel
Conflicts:
	channels/audin/client/oss/audin_oss.c
	channels/drive/client/drive_main.c
	channels/printer/client/printer_cups.c
	channels/printer/client/printer_main.c
	channels/rail/client/rail_main.c
	channels/rdpgfx/client/rdpgfx_main.c
	channels/rdpsnd/client/oss/rdpsnd_oss.c
	channels/remdesk/client/remdesk_main.c
	channels/remdesk/server/remdesk_main.c
	channels/tsmf/client/tsmf_media.c
2015-07-15 01:57:07 -07:00
Bernhard Miklautz
b6a799e5d0 x11/cliprdr: handle empty format names
The recently added strdup checks ignored the fact that format names
can be NULL.
2015-07-02 15:39:35 +02:00
Bernhard Miklautz
bf73f4e4f1 Fix unchecked strdups
* add missing checks
* adapt function return values where necessary
* add initial test for settings
2015-06-22 19:09:59 +02:00
Martin Haimberger
e5d5cd3c94 hardend cliprdr
hardend cliprdr server and client
also updated all callbacks in the server and client
implementations
2015-06-18 03:04:31 -07:00
Zhang Zhaolong
855b1201aa xf_cliprdr: fix incorrect usage of realloc.
Signed-off-by: Zhang Zhaolong <zhangzl2013@126.com>
2015-03-11 12:31:50 +08:00
Marc-André Moreau
5e6b3de74e xfreerdp: fix usage of incorrect target clipboard format id 2014-12-26 11:30:09 -05:00
Marc-André Moreau
e6eeae2ddd xfreerdp: fix clipboard null byte at end of string (issue #2209) 2014-12-21 13:49:22 -05:00
Armin Novak
23d64bd6ca Fixed uninitialized value. 2014-12-07 00:29:28 +01:00
Marc-André Moreau
f2267a2277 libwinpr-clipboard: fix memory corruption and leaks 2014-12-04 13:19:10 -05:00
Marc-André Moreau
75e0e84130 Merge branch 'master' of github.com:FreeRDP/FreeRDP 2014-12-04 10:00:10 -05:00
Norbert Federa
c82d8c9c6b xfreerdp: fix cliprdr SelectionNotify enless loop
xf_cliprdr_process_selection_notify calls xf_cliprdr_send_client_format_list
if the SelectionNotify event property was None.
xf_cliprdr_send_client_format_list called XConvertSelection even if there
was no clipboard owner. In that case the XServer generates a SelectionNotify
event to the requestor (us) with property None and so on ...

The most obvious fix is to ensure that XConvertSelection is not called if
the owner is None which is done in this commit.
2014-12-04 00:19:23 +01:00
Marc-André Moreau
fdd2dc7601 freerdp: patch valgrind leaks, cleanup 2014-12-03 14:17:27 -05:00
Armin Novak
bfd3962f03 Fixed memory leak. 2014-11-17 00:26:33 +01:00
Marc-André Moreau
27dca6258a xfreerdp: replace wire to local clipboard conversion 2014-10-17 20:55:12 -04:00
Marc-André Moreau
83ecddd6c1 xfreerdp: replace cliprdr to wire format conversion 2014-10-17 20:40:11 -04:00
Marc-André Moreau
a1e660d92e freerdp: unify clipboard standard format id definitions 2014-10-16 22:20:12 -04:00
Marc-André Moreau
334dec3c1f winpr: add pragma pack, bitmap + clipboard definitions 2014-10-16 21:45:47 -04:00
Marc-André Moreau
f6b3b24c22 winpr: add new line ending, utf16 byte order swap functions 2014-10-16 18:07:44 -04:00
Marc-André Moreau
d668855be6 xfreerdp: refactor cliprdr helpers 2014-10-16 15:05:06 -04:00
Marc-André Moreau
4111625488 xfreerdp: cleanup unused cliprdr code 2014-10-15 22:56:25 -04:00
Marc-André Moreau
2e82e6d22d xfreerdp: fix clipboard sync 2014-10-15 22:48:18 -04:00
Marc-André Moreau
38bac22204 xfreerdp: migrate to cliprdr callback interface 2014-10-15 21:30:11 -04:00
Marc-André Moreau
4ba0010294 xfreerdp: partially migrate to cliprdr callback interface 2014-10-15 17:42:55 -04:00
Marc-André Moreau
7a5d45ed34 xfreerdp: further cliprdr refactoring 2014-10-15 15:49:57 -04:00
Marc-André Moreau
94da63f980 xfreerdp: start migrating to cliprdr callback interface 2014-10-14 22:58:01 -04:00
Marc-André Moreau
0abe24a1c0 xfreerdp: start refactoring cliprdr 2014-10-14 22:24:07 -04:00
Armin Novak
7913a57bc5 Using wlog for logging in clients now. 2014-09-15 08:55:00 +02:00
Armin Novak
0780c0993e Replaced fprintf(stderr with DEBUG_WARN 2014-08-07 22:21:07 +02:00
Norbert Federa
196330111b xfreerdp: xfixes selection ownership notification
The X11 core protocol does not have support for selection ownership
notifications. Until now xfreerdp worked around this issue by always sending
a format list pdu to the server after sending the format data response pdu
which makes the server side think that the clients clipboard data has changed.

This workaround has some severe drawbacks:
* it causes unnecessary data transfers because even without local clipboard
  data changes the same data is always re-transferred over the channel
* with some clipboard managers (in the server sessions) you will get massive
  endless data transfer loops because these managers immediately request the
  data on clipboard changes.

The correct (core X11) way would be polling for selection ownership changes
which must include the ability to detect changes to the TIMESTAMP target if
the selection owner did not change.
The alternative to the poll based approach is using the X Fixes extension in
order to get selection ownership notifications.

This commit adds support for the XFIXES solution and also moves the complete
clipboard related event handling from xf_event.c to xf_cliprdr.c
2014-07-07 20:31:23 +02:00
Hardening
07e0eba7db Check that bpp has reasonable value
As bpp is often used for malloc computations, let's check that it has
a reasonable value.
2014-05-29 10:12:02 +02:00
Marc-André Moreau
bb78fb16f8 xfreerdp: refactor to make use of single xfContext* and remove xfInfo* 2013-06-12 18:57:25 -04:00
Marc-André Moreau
8e151409be libfreerdp-client: export and register successfully interface pointer for channel 2013-05-12 21:23:12 -04:00
Marc-André Moreau
fdf3ddcf9e freerdp: purge deprecated stream utils 2013-05-08 17:48:30 -04:00
Marc-André Moreau
fd230443c5 freerdp: purge old stream utils 2013-05-08 16:27:21 -04:00
Marc-André Moreau
5b92413843 freerdp: purge deprecated stream utils 2013-05-08 16:09:16 -04:00
Marc-André Moreau
51715636a5 freerdp: remove some deprecated stream utils 2013-04-29 22:35:15 -04:00
Marc-André Moreau
9b351568fa xfreerdp: start implementing simplified client interface 2013-04-02 15:13:10 -04:00
Marc-André Moreau
d70c1e4d5e xfreerdp: fix RemoteApp decorations 2013-03-28 23:09:28 -04:00
Marc-André Moreau
3417a3aab5 freerdp: merge RDP_EVENT type with wMessage 2013-03-28 21:13:56 -04:00