diff options
Diffstat (limited to 'server')
-rw-r--r-- | server/demarshallers.h | 4 | ||||
-rw-r--r-- | server/red_worker.c | 5 | ||||
-rw-r--r-- | server/reds.c | 6 | ||||
-rw-r--r-- | server/snd_worker.c | 5 |
4 files changed, 13 insertions, 7 deletions
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); |