diff options
author | Marc-André Lureau <marcandre.lureau@redhat.com> | 2011-02-27 13:33:28 +0100 |
---|---|---|
committer | Alon Levy <alevy@redhat.com> | 2011-07-21 15:09:26 +0300 |
commit | a5946a54dd54b4a3a72c9683f43b710f3f0b3f11 (patch) | |
tree | 8568a5456f16eff783739f174ad345cbc3f8ac98 /server | |
parent | 6d8cbc23491ae53933662b169138c048cc6d54a6 (diff) | |
download | spice-a5946a54dd54b4a3a72c9683f43b710f3f0b3f11.tar.gz spice-a5946a54dd54b4a3a72c9683f43b710f3f0b3f11.tar.xz spice-a5946a54dd54b4a3a72c9683f43b710f3f0b3f11.zip |
server: use reds_{link,stream}_free()
Be carefull removing the watch before, like __release_link
https://bugs.freedesktop.org/show_bug.cgi?id=34795
Diffstat (limited to 'server')
-rw-r--r-- | server/red_channel.c | 3 | ||||
-rw-r--r-- | server/reds.c | 63 |
2 files changed, 23 insertions, 43 deletions
diff --git a/server/red_channel.c b/server/red_channel.c index a7620f77..f0640549 100644 --- a/server/red_channel.c +++ b/server/red_channel.c @@ -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); } diff --git a/server/reds.c b/server/reds.c index 991660e0..acbce57a 100644 --- a/server/reds.c +++ b/server/reds.c @@ -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); |