Hi Jonatan,
yes, it works exactly like this. See rdpdr_main.c
Do you get CHANNEL_EVENT_WRITE_COMPLETE for each call to
FreeRDP_VirtualChannelWriteEx and free the stream then?
The Stream from the pool internal to FreeRDP_VirtualChannelWriteEx will
not grow large as it only sends out chunks of data of a few kb.
regards
Armin
On 02.09.20 11:07, Jonatan Volkov via FreeRDP-devel wrote:
Hi Armin,
Thanks for being on this!
Does xfreerdp use FreeRDP_VirtualChannelWriteEx to send the file chunks?
This is the case with Guacamole 1.2.0 - it calls
FreeRDP_VirtualChannelWriteEx (via the pVirtualChannelWriteEx entry point)
for each buffer of file data, wrapped in a wStream that is earlier created
using Stream_New in the Guacamole code. So in fact a new wStream is
allocated for each call to FreeRDP_VirtualChannelWriteEx. Is this the
intended method? Does xfreerdp handle it differently?
Thanks,
Jonatan
---------- Forwarded message ---------
From: Armin Novak via FreeRDP-devel <freerdp-devel@lists.sourceforge.net>
Date: Wed, Sep 2, 2020 at 11:25 AM
Subject: Re: [FreeRDP-devel] Fwd: Memory not being freed during file copy
via an RDP session
To: <freerdp-devel@lists.sourceforge.net>
Some follow up:
debugged the whole thing a bit with current xfreerdp from
68c7bcc6501b6df12ad75d65c7b4c2685fb755e4
I could not get any stream in the pool to grow beyond 162k
The chunks that get copied (released with Stream_Free) are 2MB during
file copy from xfreerdp host to RDP server.
regards
Armin
On 01.09.20 15:52, Armin Novak via FreeRDP-devel wrote:
Hi Jonatan,
No, the dynamic channel write method is internal to libfreerdp2.so, so
you should not have to do anything there.
Could you clarify which stream is growing so large?
All buffers should be much smaller even with large files.
regards
Armin
On 01.09.20 15:19, Jonatan Volkov via FreeRDP-devel wrote:
Hi Armin,
Thank you for your reply.
I am talking about copying a file via a shared drive.
Meanwhile we have seen that FreeRDP 2.0.0 was using Stream_Free() to free
the wStream that was initially passed to FreeRDP_VirtualChannelWriteEx,
while 2.2.0 uses Stream_Release.
It is most likely that the current implementation in Guacamole server is
still aligned for the 2.0.0 way.
If we are copying a large file (several GB) then memory can run out
during
the copy operation itself, so only releasing the buffers after the file
is
finished copying does not cover us. Or maybe I misunderstood the usage
you
propose for CHANNEL_EVENT_WRITE_COMPLETE ?
Thanks!
Jonatan
---------- Forwarded message ---------
From: Armin Novak via FreeRDP-devel <freerdp-devel@lists.sourceforge.net>
Date: Tue, Sep 1, 2020 at 10:27 AM
Subject: Re: [FreeRDP-devel] Memory not being freed during file copy via
an
RDP session
To: <freerdp-devel@lists.sourceforge.net>
Hi,
could you please clarify a bit?
Are you talking about using a shared drive or clipboard file copy?
As for FreeRDP_VirtualChannelWriteEx, you need to listen for
CHANNEL_EVENT_WRITE_COMPLETE and free any buffer supplied before there.
(see any of the channels like clipboard using that)
regards
Armin
On 31.08.20 23:09, Jonatan Volkov via FreeRDP-devel wrote:
Hi all,
I am trying to hunt down an issue where during an RDP session via Apache
Gaucamole, copying a file from a shared directory/drive to any location
on
the RDP server reserves memory that never gets freed. This leak
eventually
brings down the guac session process after ~3GB have been copied in
such a
way (on a weak machine).
We are getting this with Guacamole 1.2.0 (over FreeRDP 2.2.0) - was not
happening with Guacamole 1.0.0 (over FreeRDP 1.1).
Using valgrind we have tracked the problem to the repeated calls to
FreeRDP_VirtualChannelWriteEx containing chunks of the copied file. The
arguments include a wStream object that was earlier created via
Stream_New.
It appears, and the valgrind trace supports it, that this wStream
instance
never gets freed by FreeRDP.
I could not find an open issue or discussions on it. Has anyone
encountered
this problem, or in general has any idea regarding the root cause of
this
leak?
Should we be using the StreamPool from the external code (Guacamole in
fact) rather than creating a new instance of the stream for each write
operation?
Thanks! Regards,
Jonatan
_______________________________________________
FreeRDP-devel mailing list
FreeRDP-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/freerdp-devel
_______________________________________________
FreeRDP-devel mailing list
FreeRDP-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/freerdp-devel
_______________________________________________
FreeRDP-devel mailing list
FreeRDP-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/freerdp-devel
_______________________________________________
FreeRDP-devel mailing list
FreeRDP-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/freerdp-devel
_______________________________________________
FreeRDP-devel mailing list
FreeRDP-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/freerdp-devel
_______________________________________________
FreeRDP-devel mailing list
FreeRDP-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/freerdp-devel
_______________________________________________
FreeRDP-devel mailing list
FreeRDP-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/freerdp-devel