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:
Marc-André Lureau 2011-02-27 13:33:28 +01:00 committed by Alon Levy
parent 6d8cbc2349
commit a5946a54dd
2 changed files with 23 additions and 43 deletions

View File

@ -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);
}

View File

@ -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);