reds_on_main_agent_monitor_config() is manually implementing a grow-on-append char *. glib's GByteArray can do this for us, using it makes the code simpler to read. --- server/reds-private.h | 4 +--- server/reds.c | 27 +++++++++++++-------------- 2 files changed, 14 insertions(+), 17 deletions(-) diff --git a/server/reds-private.h b/server/reds-private.h index 9358d27..9d8b5d1 100644 --- a/server/reds-private.h +++ b/server/reds-private.h @@ -120,9 +120,7 @@ typedef struct SpiceCharDeviceStateItem { * client, being passed to the guest */ typedef struct RedsClientMonitorsConfig { MainChannelClient *mcc; - uint8_t *buffer; - int buffer_size; - int buffer_pos; + GByteArray *config_data; } RedsClientMonitorsConfig; typedef struct RedsState { diff --git a/server/reds.c b/server/reds.c index 1456b75..18743a3 100644 --- a/server/reds.c +++ b/server/reds.c @@ -1079,10 +1079,10 @@ static void reds_client_monitors_config_cleanup(void) { RedsClientMonitorsConfig *cmc = &reds->client_monitors_config; - cmc->buffer_size = cmc->buffer_pos = 0; - free(cmc->buffer); - cmc->buffer = NULL; - cmc->mcc = NULL; + if (cmc->config_data != NULL) { + g_byte_array_free(cmc->config_data, TRUE); + } + cmc->config_data = NULL; } static void reds_on_main_agent_monitors_config( @@ -1092,19 +1092,18 @@ static void reds_on_main_agent_monitors_config( VDAgentMonitorsConfig *monitors_config; RedsClientMonitorsConfig *cmc = &reds->client_monitors_config; - cmc->buffer_size += size; - cmc->buffer = realloc(cmc->buffer, cmc->buffer_size); - spice_assert(cmc->buffer); cmc->mcc = mcc; - memcpy(cmc->buffer + cmc->buffer_pos, message, size); - cmc->buffer_pos += size; - msg_header = (VDAgentMessage *)cmc->buffer; - if (sizeof(VDAgentMessage) > cmc->buffer_size || - msg_header->size > cmc->buffer_size - sizeof(VDAgentMessage)) { - spice_debug("not enough data yet. %d\n", cmc->buffer_size); + if (cmc->config_data == NULL) { + cmc->config_data = g_byte_array_new(); + } + g_byte_array_append(cmc->config_data, message, size); + msg_header = (VDAgentMessage *)cmc->config_data->data; + if (sizeof(VDAgentMessage) > cmc->config_data->len || + msg_header->size > cmc->config_data->len - sizeof(VDAgentMessage)) { + spice_debug("not enough data yet. %d\n", cmc->config_data->len); return; } - monitors_config = (VDAgentMonitorsConfig *)(cmc->buffer + sizeof(*msg_header)); + monitors_config = (VDAgentMonitorsConfig *)(cmc->config_data->data + sizeof(*msg_header)); spice_debug("%s: %d\n", __func__, monitors_config->num_of_monitors); red_dispatcher_client_monitors_config(monitors_config); reds_client_monitors_config_cleanup(); -- 1.8.3.1 _______________________________________________ Spice-devel mailing list Spice-devel@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/spice-devel