Merge pull request #3107 from matt335672/fix_resize_crash

Fix GFX resize crash
This commit is contained in:
matt335672 2024-06-10 18:50:09 +01:00 committed by GitHub
commit 6fa941e208
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 23 additions and 8 deletions

View File

@ -88,8 +88,15 @@ static void
xrdp_enc_data_destructor(void *item, void *closure) xrdp_enc_data_destructor(void *item, void *closure)
{ {
XRDP_ENC_DATA *enc = (XRDP_ENC_DATA *)item; XRDP_ENC_DATA *enc = (XRDP_ENC_DATA *)item;
g_free(enc->u.sc.drects); if (ENC_IS_BIT_SET(enc->flags, ENC_FLAGS_GFX_BIT))
g_free(enc->u.sc.crects); {
g_free(enc->u.gfx.cmd);
}
else
{
g_free(enc->u.sc.drects);
g_free(enc->u.sc.crects);
}
g_free(enc); g_free(enc);
} }
@ -213,7 +220,8 @@ xrdp_encoder_create(struct xrdp_mm *mm)
g_snprintf(buf, 1024, "xrdp_%8.8x_encoder_event_processed", pid); g_snprintf(buf, 1024, "xrdp_%8.8x_encoder_event_processed", pid);
self->xrdp_encoder_event_processed = g_create_wait_obj(buf); self->xrdp_encoder_event_processed = g_create_wait_obj(buf);
g_snprintf(buf, 1024, "xrdp_%8.8x_encoder_term", pid); g_snprintf(buf, 1024, "xrdp_%8.8x_encoder_term", pid);
self->xrdp_encoder_term = g_create_wait_obj(buf); self->xrdp_encoder_term_request = g_create_wait_obj(buf);
self->xrdp_encoder_term_done = g_create_wait_obj(buf);
if (client_info->gfx) if (client_info->gfx)
{ {
const char *env_var = g_getenv("XRDP_GFX_FRAMES_IN_FLIGHT"); const char *env_var = g_getenv("XRDP_GFX_FRAMES_IN_FLIGHT");
@ -289,8 +297,12 @@ xrdp_encoder_delete(struct xrdp_encoder *self)
return; return;
} }
/* tell worker thread to shut down */ /* tell worker thread to shut down */
g_set_wait_obj(self->xrdp_encoder_term); g_set_wait_obj(self->xrdp_encoder_term_request);
g_sleep(1000); g_obj_wait(&self->xrdp_encoder_term_done, 1, NULL, 0, 5000);
if (!g_is_wait_obj_set(self->xrdp_encoder_term_done))
{
LOG(LOG_LEVEL_WARNING, "Encoder failed to shut down cleanly");
}
#ifdef XRDP_RFXCODEC #ifdef XRDP_RFXCODEC
for (index = 0; index < 16; index++) for (index = 0; index < 16; index++)
@ -323,7 +335,8 @@ xrdp_encoder_delete(struct xrdp_encoder *self)
/* destroy wait objects used for signalling */ /* destroy wait objects used for signalling */
g_delete_wait_obj(self->xrdp_encoder_event_to_proc); g_delete_wait_obj(self->xrdp_encoder_event_to_proc);
g_delete_wait_obj(self->xrdp_encoder_event_processed); g_delete_wait_obj(self->xrdp_encoder_event_processed);
g_delete_wait_obj(self->xrdp_encoder_term); g_delete_wait_obj(self->xrdp_encoder_term_request);
g_delete_wait_obj(self->xrdp_encoder_term_done);
/* cleanup fifos */ /* cleanup fifos */
fifo_delete(self->fifo_to_proc, NULL); fifo_delete(self->fifo_to_proc, NULL);
@ -1406,7 +1419,7 @@ proc_enc_msg(void *arg)
event_to_proc = self->xrdp_encoder_event_to_proc; event_to_proc = self->xrdp_encoder_event_to_proc;
term_obj = g_get_term(); term_obj = g_get_term();
lterm_obj = self->xrdp_encoder_term; lterm_obj = self->xrdp_encoder_term_request;
cont = 1; cont = 1;
while (cont) while (cont)
@ -1457,6 +1470,7 @@ proc_enc_msg(void *arg)
} }
} /* end while (cont) */ } /* end while (cont) */
g_set_wait_obj(self->xrdp_encoder_term_done);
LOG_DEVEL(LOG_LEVEL_DEBUG, "proc_enc_msg: thread exit"); LOG_DEVEL(LOG_LEVEL_DEBUG, "proc_enc_msg: thread exit");
return 0; return 0;
} }

View File

@ -24,7 +24,8 @@ struct xrdp_encoder
int max_compressed_bytes; int max_compressed_bytes;
tbus xrdp_encoder_event_to_proc; tbus xrdp_encoder_event_to_proc;
tbus xrdp_encoder_event_processed; tbus xrdp_encoder_event_processed;
tbus xrdp_encoder_term; tbus xrdp_encoder_term_request;
tbus xrdp_encoder_term_done;
struct fifo *fifo_to_proc; struct fifo *fifo_to_proc;
struct fifo *fifo_processed; struct fifo *fifo_processed;
tbus mutex; tbus mutex;