mirror of
https://gitlab.uni-freiburg.de/opensourcevdi/spice
synced 2026-08-12 17:15:21 +00:00
server: use reds_{link,stream}_free()
Be carefull removing the watch before, like __release_link https://bugs.freedesktop.org/show_bug.cgi?id=34795
This commit is contained in:
parent
6d8cbc2349
commit
a5946a54dd
@ -304,8 +304,7 @@ void red_channel_destroy(RedChannel *channel)
|
||||
return;
|
||||
}
|
||||
red_channel_pipe_clear(channel);
|
||||
channel->core->watch_remove(channel->peer->watch);
|
||||
channel->peer->cb_free(channel->peer);
|
||||
reds_stream_free(channel->peer);
|
||||
free(channel);
|
||||
}
|
||||
|
||||
|
||||
@ -515,28 +515,6 @@ static void reds_link_free(RedLinkInfo *link)
|
||||
free(link);
|
||||
}
|
||||
|
||||
static void __reds_release_link(RedLinkInfo *link)
|
||||
{
|
||||
ASSERT(link->peer);
|
||||
if (link->peer->watch) {
|
||||
core->watch_remove(link->peer->watch);
|
||||
link->peer->watch = NULL;
|
||||
}
|
||||
free(link->link_mess);
|
||||
BN_free(link->tiTicketing.bn);
|
||||
if (link->tiTicketing.rsa) {
|
||||
RSA_free(link->tiTicketing.rsa);
|
||||
}
|
||||
free(link);
|
||||
}
|
||||
|
||||
static inline void reds_release_link(RedLinkInfo *link)
|
||||
{
|
||||
RedsStream *peer = link->peer;
|
||||
__reds_release_link(link);
|
||||
peer->cb_free(peer);
|
||||
}
|
||||
|
||||
static struct iovec *reds_iovec_skip(struct iovec vec[], int skip, int *vec_size)
|
||||
{
|
||||
struct iovec *now = vec;
|
||||
@ -791,8 +769,7 @@ static void reds_disconnect()
|
||||
}
|
||||
|
||||
reds_shatdown_channels();
|
||||
reds_stream_remove_watch(reds->peer);
|
||||
reds->peer->cb_free(reds->peer);
|
||||
reds_stream_free(reds->peer);
|
||||
reds->peer = NULL;
|
||||
reds->in_handler.shut = TRUE;
|
||||
reds->link_id = 0;
|
||||
@ -2078,7 +2055,7 @@ static void reds_handle_main_link(RedLinkInfo *link)
|
||||
} else {
|
||||
if (link->link_mess->connection_id != reds->link_id) {
|
||||
reds_send_link_result(link, SPICE_LINK_ERR_BAD_CONNECTION_ID);
|
||||
reds_release_link(link);
|
||||
reds_link_free(link);
|
||||
return;
|
||||
}
|
||||
reds_send_link_result(link, SPICE_LINK_ERR_OK);
|
||||
@ -2094,7 +2071,10 @@ static void reds_handle_main_link(RedLinkInfo *link)
|
||||
reds->in_handler.shut = FALSE;
|
||||
|
||||
reds_show_new_channel(link, connection_id);
|
||||
__reds_release_link(link);
|
||||
reds_stream_remove_watch(link->peer);
|
||||
link->peer = NULL;
|
||||
link->link_mess = NULL;
|
||||
reds_link_free(link);
|
||||
if (vdagent) {
|
||||
SpiceCharDeviceInterface *sif;
|
||||
sif = SPICE_CONTAINEROF(vdagent->base.sif, SpiceCharDeviceInterface, base);
|
||||
@ -2396,12 +2376,11 @@ static void inputs_event(int fd, int event, void *data)
|
||||
if (event & SPICE_WATCH_EVENT_READ) {
|
||||
if (handle_incoming(inputs_state->peer, &inputs_state->in_handler)) {
|
||||
inputs_relase_keys();
|
||||
reds_stream_remove_watch(inputs_state->peer);
|
||||
if (inputs_state->channel) {
|
||||
inputs_state->channel->data = NULL;
|
||||
reds->inputs_state = NULL;
|
||||
}
|
||||
inputs_state->peer->cb_free(inputs_state->peer);
|
||||
reds_stream_free(inputs_state->peer);
|
||||
free(inputs_state);
|
||||
}
|
||||
}
|
||||
@ -2574,14 +2553,14 @@ static void reds_handle_other_links(RedLinkInfo *link)
|
||||
|
||||
if (!reds->link_id || reds->link_id != link_mess->connection_id) {
|
||||
reds_send_link_result(link, SPICE_LINK_ERR_BAD_CONNECTION_ID);
|
||||
reds_release_link(link);
|
||||
reds_link_free(link);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!(channel = reds_find_channel(link_mess->channel_type,
|
||||
link_mess->channel_id))) {
|
||||
reds_send_link_result(link, SPICE_LINK_ERR_CHANNEL_NOT_AVAILABLE);
|
||||
reds_release_link(link);
|
||||
reds_link_free(link);
|
||||
return;
|
||||
}
|
||||
|
||||
@ -2607,8 +2586,10 @@ static void reds_handle_other_links(RedLinkInfo *link)
|
||||
reds_push_pipe_item(item);
|
||||
}
|
||||
peer = link->peer;
|
||||
reds_stream_remove_watch(peer);
|
||||
link->peer = NULL;
|
||||
link->link_mess = NULL;
|
||||
__reds_release_link(link);
|
||||
reds_link_free(link);
|
||||
caps = (uint32_t *)((uint8_t *)link_mess + link_mess->caps_offset);
|
||||
channel->link(channel, peer, reds->mig_target, link_mess->num_common_caps,
|
||||
link_mess->num_common_caps ? caps : NULL, link_mess->num_channel_caps,
|
||||
@ -2636,13 +2617,13 @@ static void reds_handle_ticket(void *opaque)
|
||||
reds_send_link_result(link, SPICE_LINK_ERR_PERMISSION_DENIED);
|
||||
red_printf("Ticketing is enabled, but no password is set. "
|
||||
"please set a ticket first");
|
||||
reds_release_link(link);
|
||||
reds_link_free(link);
|
||||
return;
|
||||
}
|
||||
|
||||
if (expired || strncmp(password, actual_sever_pass, SPICE_MAX_PASSWORD_LENGTH) != 0) {
|
||||
reds_send_link_result(link, SPICE_LINK_ERR_PERMISSION_DENIED);
|
||||
reds_release_link(link);
|
||||
reds_link_free(link);
|
||||
return;
|
||||
}
|
||||
}
|
||||
@ -2721,7 +2702,7 @@ static void reds_handle_read_link_done(void *opaque)
|
||||
link->link_header.size ||
|
||||
link_mess->caps_offset < sizeof(*link_mess))) {
|
||||
reds_send_link_error(link, SPICE_LINK_ERR_INVALID_DATA);
|
||||
reds_release_link(link);
|
||||
reds_link_free(link);
|
||||
return;
|
||||
}
|
||||
|
||||
@ -2733,12 +2714,12 @@ static void reds_handle_read_link_done(void *opaque)
|
||||
red_printf("spice channels %d should be encrypted", link_mess->channel_type);
|
||||
reds_send_link_error(link, SPICE_LINK_ERR_NEED_SECURED);
|
||||
}
|
||||
reds_release_link(link);
|
||||
reds_link_free(link);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!reds_send_link_ack(link)) {
|
||||
reds_release_link(link);
|
||||
reds_link_free(link);
|
||||
return;
|
||||
}
|
||||
|
||||
@ -2759,7 +2740,7 @@ static void reds_handle_link_error(void *opaque, int err)
|
||||
red_printf("%s", strerror(errno));
|
||||
break;
|
||||
}
|
||||
reds_release_link(link);
|
||||
reds_link_free(link);
|
||||
}
|
||||
|
||||
static void reds_handle_read_header_done(void *opaque)
|
||||
@ -2770,7 +2751,7 @@ static void reds_handle_read_header_done(void *opaque)
|
||||
|
||||
if (header->magic != SPICE_MAGIC) {
|
||||
reds_send_link_error(link, SPICE_LINK_ERR_INVALID_MAGIC);
|
||||
reds_release_link(link);
|
||||
reds_link_free(link);
|
||||
return;
|
||||
}
|
||||
|
||||
@ -2780,7 +2761,7 @@ static void reds_handle_read_header_done(void *opaque)
|
||||
}
|
||||
|
||||
red_printf("version mismatch");
|
||||
reds_release_link(link);
|
||||
reds_link_free(link);
|
||||
return;
|
||||
}
|
||||
|
||||
@ -2789,7 +2770,7 @@ static void reds_handle_read_header_done(void *opaque)
|
||||
if (header->size < sizeof(SpiceLinkMess)) {
|
||||
reds_send_link_error(link, SPICE_LINK_ERR_INVALID_DATA);
|
||||
red_printf("bad size %u", header->size);
|
||||
reds_release_link(link);
|
||||
reds_link_free(link);
|
||||
return;
|
||||
}
|
||||
|
||||
@ -2822,7 +2803,7 @@ static void reds_handle_ssl_accept(int fd, int event, void *data)
|
||||
int ssl_error = SSL_get_error(link->peer->ssl, return_code);
|
||||
if (ssl_error != SSL_ERROR_WANT_READ && ssl_error != SSL_ERROR_WANT_WRITE) {
|
||||
red_printf("SSL_accept failed, error=%d", ssl_error);
|
||||
reds_release_link(link);
|
||||
reds_link_free(link);
|
||||
} else {
|
||||
if (ssl_error == SSL_ERROR_WANT_READ) {
|
||||
core->watch_update_mask(link->peer->watch, SPICE_WATCH_EVENT_READ);
|
||||
|
||||
Loading…
Reference in New Issue
Block a user