GUACAMOLE-935: Free internals of rdpBitmap only when required.
In FreeRDP 2.0.0-rc0 and earlier, Bitmap_Free(bitmap) invokes the free
handler of the given bitmap, frees bitmap->data, and then frees the
bitmap. The implementation-specific free handler needs to be aware only
of the implementation's own concerns.
After FreeRDP 2.0.0-rc0, Bitmap_Free(bitmap) only invokes the
implementation-specific free handler, and it's on the implementation to
know that bitmap->data must be manually freed with _aligned_free() and
bitmap must be freed with free(). The implementation-specific free
handler must be aware of the internals of the library.
See commit 8dda26a.
diff --git a/configure.ac b/configure.ac
index 24c1588..cac4307 100644
--- a/configure.ac
+++ b/configure.ac
@@ -578,6 +578,37 @@
fi
+# Variation in memory internal allocation/free behavior
+if test "x${have_freerdp2}" = "xyes"
+then
+
+ # FreeRDP 2.0.0-rc0 and older automatically free rdpBitmap and its
+ # associated data member within Bitmap_Free(), relying on the
+ # implementation-specific free handler to free only implementation-specific
+ # data. This changed in commit 2cf10cc, and implementations must now
+ # manually free all data associated with the rdpBitmap, even data which
+ # was not allocated by the implementation.
+ AC_MSG_CHECKING([whether Bitmap_Free() frees the rdpBitmap and its image data])
+ AC_RUN_IFELSE([AC_LANG_SOURCE([[
+
+ #include <freerdp/version.h>
+
+ #include <string.h>
+
+ int main() {
+ /* Return successfully if version is 2.0.0-rc0 */
+ return strcmp(FREERDP_VERSION_FULL, "2.0.0-dev");
+ }
+
+ ]])],
+ [AC_MSG_RESULT([yes])]
+ [AC_DEFINE([FREERDP_BITMAP_FREE_FREES_BITMAP],,
+ [Whether Bitmap_Free() frees the rdpBitmap and its image data])],
+ [AC_MSG_RESULT([no])],
+ [AC_MSG_RESULT([assuming no (cross-compiling)])])
+
+fi
+
# Glyph callback variants
if test "x${have_freerdp2}" = "xyes"
then
diff --git a/src/protocols/rdp/bitmap.c b/src/protocols/rdp/bitmap.c
index db29316..ac4d979 100644
--- a/src/protocols/rdp/bitmap.c
+++ b/src/protocols/rdp/bitmap.c
@@ -20,6 +20,7 @@
#include "bitmap.h"
#include "common/display.h"
#include "common/surface.h"
+#include "config.h"
#include "rdp.h"
#include <cairo/cairo.h>
@@ -127,12 +128,14 @@
if (buffer != NULL)
guac_common_display_free_buffer(rdp_client->display, buffer);
- /* NOTE: FreeRDP-allocated memory for the rdpBitmap will NOT be
- * automatically released after this free handler is invoked, thus we must
- * do so manually here */
+#ifndef FREERDP_BITMAP_FREE_FREES_BITMAP
+ /* NOTE: Except in FreeRDP 2.0.0-rc0 and earlier, FreeRDP-allocated memory
+ * for the rdpBitmap will NOT be automatically released after this free
+ * handler is invoked, thus we must do so manually here */
_aligned_free(bitmap->data);
free(bitmap);
+#endif
}