From 9123e24e7b68ad36d4ac2b8f325ea249a5ea9ff5 Mon Sep 17 00:00:00 2001 From: Alexander Larsson Date: Tue, 22 Jun 2010 10:53:24 +0200 Subject: Add destructor for demarshalled messages This is required because we don't want to free messages that just refer to the unparsed message (like SpiceMsgData). Also, in the future we might need it for more complex demarshalling. --- server/demarshallers.h | 4 +++- server/red_worker.c | 5 +++-- server/reds.c | 6 ++++-- server/snd_worker.c | 5 +++-- 4 files changed, 13 insertions(+), 7 deletions(-) (limited to 'server') diff --git a/server/demarshallers.h b/server/demarshallers.h index e568cd0d..abe9dfab 100644 --- a/server/demarshallers.h +++ b/server/demarshallers.h @@ -17,7 +17,9 @@ #ifndef _H_DEMARSHAL #define _H_DEMARSHAL -typedef uint8_t * (*spice_parse_channel_func_t)(uint8_t *message_start, uint8_t *message_end, uint16_t message_type, int minor, size_t *size_out); +typedef void (*message_destructor_t)(uint8_t *message); +typedef uint8_t * (*spice_parse_channel_func_t)(uint8_t *message_start, uint8_t *message_end, uint16_t message_type, int minor, + size_t *size_out, message_destructor_t *free_message); spice_parse_channel_func_t spice_get_client_channel_parser(uint32_t channel, unsigned int *max_message_type); diff --git a/server/red_worker.c b/server/red_worker.c index 3a0b16e0..ee372220 100644 --- a/server/red_worker.c +++ b/server/red_worker.c @@ -10459,6 +10459,7 @@ static void red_receive(RedChannel *channel) uint8_t *data = (uint8_t *)(header+1); size_t parsed_size; uint8_t *parsed; + message_destructor_t parsed_free; n = channel->recive_data.now - (uint8_t *)header; if (n < sizeof(SpiceDataHeader) || @@ -10466,7 +10467,7 @@ static void red_receive(RedChannel *channel) break; } parsed = channel->parser((void *)data, data + header->size, header->type, - SPICE_VERSION_MINOR, &parsed_size); + SPICE_VERSION_MINOR, &parsed_size, &parsed_free); if (parsed == NULL) { red_printf("failed to parse message type %d", header->type); @@ -10479,7 +10480,7 @@ static void red_receive(RedChannel *channel) channel->disconnect(channel); return; } - free(parsed); + parsed_free(parsed); channel->recive_data.message = (SpiceDataHeader *)((uint8_t *)header + sizeof(SpiceDataHeader) + header->size); diff --git a/server/reds.c b/server/reds.c index f9d91dbc..8c16896e 100644 --- a/server/reds.c +++ b/server/reds.c @@ -797,16 +797,18 @@ static int handle_incoming(RedsStreamContext *peer, IncomingHandler *handler) uint8_t *data = (uint8_t *)(header+1); size_t parsed_size; uint8_t *parsed; + message_destructor_t parsed_free; + buf += sizeof(SpiceDataHeader) + header->size; parsed = handler->parser(data, data + header->size, header->type, - SPICE_VERSION_MINOR, &parsed_size); + SPICE_VERSION_MINOR, &parsed_size, &parsed_free); if (parsed == NULL) { red_printf("failed to parse message type %d", header->type); return -1; } handler->handle_message(handler->opaque, parsed_size, header->type, parsed); - free(parsed); + parsed_free(parsed); if (handler->shut) { return -1; } diff --git a/server/snd_worker.c b/server/snd_worker.c index d55380c8..6c0f9d68 100644 --- a/server/snd_worker.c +++ b/server/snd_worker.c @@ -415,13 +415,14 @@ static void snd_receive(void* data) uint8_t *data = (uint8_t *)(header+1); size_t parsed_size; uint8_t *parsed; + message_destructor_t parsed_free; n = channel->recive_data.now - (uint8_t *)header; if (n < sizeof(SpiceDataHeader) || n < sizeof(SpiceDataHeader) + header->size) { break; } parsed = channel->parser((void *)data, data + header->size, header->type, - SPICE_VERSION_MINOR, &parsed_size); + SPICE_VERSION_MINOR, &parsed_size, &parsed_free); if (parsed == NULL) { red_printf("failed to parse message type %d", header->type); snd_disconnect_channel(channel); @@ -432,7 +433,7 @@ static void snd_receive(void* data) snd_disconnect_channel(channel); return; } - free(parsed); + parsed_free(parsed); channel->recive_data.message = (SpiceDataHeader *)((uint8_t *)header + sizeof(SpiceDataHeader) + header->size); -- cgit