[
https://issues.apache.org/jira/browse/GUACAMOLE-2083?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Stephen L. De Rudder updated GUACAMOLE-2083:
--------------------------------------------
Description:
guac_display_free does:
guac_rwlock_destroy(&display->last_frame.lock);
guac_rwlock_destroy(&display->pending_frame.lock);
then calls:
guac_display_free_layer(display->pending_frame.layers);
guac_display_free_layer(display->last_frame.layers);
and in guac_display_free_layer it calls:
guac_display_remove_layer(display_layer);
that then does
guac_display* display = display_layer->display;
/*
* Remove layer from pending frame
*/
guac_rwlock_acquire_write_lock(&display->pending_frame.lock);
but display->pending_frame.lock has been destroyed.
Fix is:
{{void guac_display_free(guac_display* display) {}}
{{ guac_display_stop(display);}}
{{ /* All locks, FIFOs, etc. are now unused and can be
safely destroyed */}}
{{ guac_flag_destroy(&display->render_state);}}
{{ guac_fifo_destroy(&display->ops);}}
{{ /* Free all layers within the pending_frame list
(NOTE: This will also free}}
{{ * those layers from the last_frame list) */}}
{{ while (display->pending_frame.layers != NULL)}}
{{ guac_display_free_layer(display->pending_frame.layers);}}
{{ /* Free any remaining layers that were present only
on the last_frame list}}
{{ * and not on the pending_frame list */}}
{{ while (display->last_frame.layers != NULL)}}
{{ guac_display_free_layer(display->last_frame.layers);}}
{{ guac_rwlock_destroy(&display->last_frame.lock); //
MOVED}}
{{ guac_rwlock_destroy(&display->pending_frame.lock); //
MOVED}}
{{ guac_mem_free(display);}}
{{\}}}
Thanks,
SLDR
(Stephen L. De Rudder)
was:
guac_display_free does:
guac_rwlock_destroy(&display->last_frame.lock);
guac_rwlock_destroy(&display->pending_frame.lock);
then calls:
guac_display_free_layer(display->pending_frame.layers);
guac_display_free_layer(display->last_frame.layers);
and in guac_display_free_layer it calls:
guac_display_remove_layer(display_layer);
that then does
guac_display* display = display_layer->display;
/*
* Remove layer from pending frame
*/
guac_rwlock_acquire_write_lock(&display->pending_frame.lock);
but display->pending_frame.lock has been destroyed.
Fix is:
void guac_display_free(guac_display* display) {
guac_display_stop(display);
/* All locks, FIFOs, etc. are now unused and can be safely destroyed */
guac_flag_destroy(&display->render_state);
guac_fifo_destroy(&display->ops);
/* Free all layers within the pending_frame list (NOTE: This will also free
* those layers from the last_frame list) */
while (display->pending_frame.layers != NULL)
guac_display_free_layer(display->pending_frame.layers);
/* Free any remaining layers that were present only on the last_frame list
* and not on the pending_frame list */
while (display->last_frame.layers != NULL)
guac_display_free_layer(display->last_frame.layers);
guac_rwlock_destroy(&display->last_frame.lock);
guac_rwlock_destroy(&display->pending_frame.lock);
guac_mem_free(display);
}
Thanks,
SLDR
(Stephen L. De Rudder)
> guac_rwlock_acquire_write_lock is called after guac_rwlock_destroy is called
> on a lock
> --------------------------------------------------------------------------------------
>
> Key: GUACAMOLE-2083
> URL: https://issues.apache.org/jira/browse/GUACAMOLE-2083
> Project: Guacamole
> Issue Type: Bug
> Components: guacd
> Affects Versions: 1.6.0
> Reporter: Stephen L. De Rudder
> Priority: Minor
>
> guac_display_free does:
> guac_rwlock_destroy(&display->last_frame.lock);
> guac_rwlock_destroy(&display->pending_frame.lock);
> then calls:
> guac_display_free_layer(display->pending_frame.layers);
> guac_display_free_layer(display->last_frame.layers);
> and in guac_display_free_layer it calls:
> guac_display_remove_layer(display_layer);
> that then does
> guac_display* display = display_layer->display;
> /*
> * Remove layer from pending frame
> */
> guac_rwlock_acquire_write_lock(&display->pending_frame.lock);
> but display->pending_frame.lock has been destroyed.
> Fix is:
> {{void guac_display_free(guac_display* display) {}}
> {{ guac_display_stop(display);}}
> {{ /* All locks, FIFOs, etc. are now unused and can be
> safely destroyed */}}
> {{ guac_flag_destroy(&display->render_state);}}
> {{ guac_fifo_destroy(&display->ops);}}
> {{ /* Free all layers within the pending_frame list
> (NOTE: This will also free}}
> {{ * those layers from the last_frame list) */}}
> {{ while (display->pending_frame.layers != NULL)}}
> {{ guac_display_free_layer(display->pending_frame.layers);}}
> {{ /* Free any remaining layers that were present only
> on the last_frame list}}
> {{ * and not on the pending_frame list */}}
> {{ while (display->last_frame.layers != NULL)}}
> {{ guac_display_free_layer(display->last_frame.layers);}}
> {{ guac_rwlock_destroy(&display->last_frame.lock); //
> MOVED}}
> {{ guac_rwlock_destroy(&display->pending_frame.lock);
> // MOVED}}
> {{ guac_mem_free(display);}}
> {{\}}}
> Thanks,
> SLDR
> (Stephen L. De Rudder)
--
This message was sent by Atlassian Jira
(v8.20.10#820010)