Commit 5a20d3e7 for guacamole.apache.org

commit 5a20d3e781b0756be4d3b634cbd80147783d07fc
Author: Michael Jumper <mjumper@apache.org>
Date:   Sat Jul 11 23:45:39 2026 -0700

    GUACAMOLE-2118: Automatically detach external layer buffers when freeing layers.

diff --git a/src/libguac/display-layer-list.c b/src/libguac/display-layer-list.c
index 6e61dec8..867dcf04 100644
--- a/src/libguac/display-layer-list.c
+++ b/src/libguac/display-layer-list.c
@@ -315,6 +315,10 @@ void guac_display_remove_layer(guac_display_layer* display_layer) {
     display_layer->pending_frame.prev = NULL;
     display_layer->pending_frame.next = NULL;

+    /* Automatically detach any external buffer */
+    if (display_layer->pending_frame.buffer_is_external)
+        display_layer->pending_frame.buffer = NULL;
+
     /* The layer is deliberately NOT unlinked from the last_frame list here, as
      * full removal and release of memory is deferred until after frame flush */
     display_layer->next_removed = display->pending_frame_removed_layers;
diff --git a/src/protocols/rdp/rdp.c b/src/protocols/rdp/rdp.c
index f0165a4b..69922ec8 100644
--- a/src/protocols/rdp/rdp.c
+++ b/src/protocols/rdp/rdp.c
@@ -680,12 +680,6 @@ static int guac_rdp_handle_connection(guac_client* client) {
     guac_display_render_thread_destroy(rdp_client->render_thread);
     rdp_client->render_thread = NULL;

-    /* Remove reference to FreeRDP's GDI buffer so that it can be safely freed
-     * prior to freeing the guac_display */
-    guac_display_layer_raw_context* context = guac_display_layer_open_raw(default_layer);
-    context->buffer = NULL;
-    guac_display_layer_close_raw(default_layer, context);
-
     /* Ensure all background rendering processes are stopped before freeing
      * underlying memory */
     guac_display_stop(rdp_client->display);