summaryrefslogtreecommitdiffstats
path: root/server
diff options
context:
space:
mode:
authorMarc-André Lureau <marcandre.lureau@redhat.com>2011-02-27 13:33:28 +0100
committerAlon Levy <alevy@redhat.com>2011-07-21 15:09:26 +0300
commita5946a54dd54b4a3a72c9683f43b710f3f0b3f11 (patch)
tree8568a5456f16eff783739f174ad345cbc3f8ac98 /server
parent6d8cbc23491ae53933662b169138c048cc6d54a6 (diff)
downloadspice-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.c3
-rw-r--r--server/reds.c63
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);