[Spice-devel] [PATCH spice-server 03/10] char-device: Avoid to use unaligned memory

Victor Toso victortoso at redhat.com
Wed Jan 31 13:43:32 UTC 2018


Hi,

On Mon, Jan 22, 2018 at 05:54:55PM +0000, Frediano Ziglio wrote:
> This causes some warnings with clang:
> 
> char-device.c:898:29: error: cast from 'uint8_t *' (aka 'unsigned char *') to 'uint32_t *' (aka 'unsigned int *') increases required alignment from 1 to 4 [-Werror,-Wcast-align]
>     write_to_dev_size_ptr = (uint32_t *)spice_marshaller_reserve_space(m, sizeof(uint32_t));
>                             ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> char-device.c:899:31: error: cast from 'uint8_t *' (aka 'unsigned char *') to 'uint32_t *' (aka 'unsigned int *') increases required alignment from 1 to 4 [-Werror,-Wcast-align]
>     write_to_dev_tokens_ptr = (uint32_t *)spice_marshaller_reserve_space(m, sizeof(uint32_t));
>                               ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> 
> This also fixes some minor endianness issue (on big endian machine
> integers were not properly encoded).
> 
> Signed-off-by: Frediano Ziglio <fziglio at redhat.com>
> ---
>  server/char-device.c | 24 +++++++++++++-----------
>  1 file changed, 13 insertions(+), 11 deletions(-)
> 
> diff --git a/server/char-device.c b/server/char-device.c
> index 2f8d3821..242d8782 100644
> --- a/server/char-device.c
> +++ b/server/char-device.c
> @@ -880,8 +880,9 @@ void red_char_device_migrate_data_marshall(RedCharDevice *dev,
>  {
>      RedCharDeviceClient *dev_client;
>      GList *item;
> -    uint32_t *write_to_dev_size_ptr;
> -    uint32_t *write_to_dev_tokens_ptr;
> +    uint8_t *write_to_dev_sizes_ptr;
> +    uint32_t write_to_dev_size;
> +    uint32_t write_to_dev_tokens;
>      SpiceMarshaller *m2;
>  
>      /* multi-clients are not supported */
> @@ -895,10 +896,9 @@ void red_char_device_migrate_data_marshall(RedCharDevice *dev,
>      spice_marshaller_add_uint8(m, 1); /* connected */
>      spice_marshaller_add_uint32(m, dev_client->num_client_tokens);
>      spice_marshaller_add_uint32(m, dev_client->num_send_tokens);
> -    write_to_dev_size_ptr = (uint32_t *)spice_marshaller_reserve_space(m, sizeof(uint32_t));
> -    write_to_dev_tokens_ptr = (uint32_t *)spice_marshaller_reserve_space(m, sizeof(uint32_t));
> -    *write_to_dev_size_ptr = 0;
> -    *write_to_dev_tokens_ptr = 0;
> +    write_to_dev_sizes_ptr = spice_marshaller_reserve_space(m, sizeof(uint32_t)*2);

Maybe write_to_dev_mem_ptr instead?

Acked-by: Victor Toso <victortoso at redhat.com>

> +    write_to_dev_size = 0;
> +    write_to_dev_tokens = 0;
>  
>      m2 = spice_marshaller_get_ptr_submarshaller(m, 0);
>      if (dev->priv->cur_write_buf) {
> @@ -908,10 +908,10 @@ void red_char_device_migrate_data_marshall(RedCharDevice *dev,
>                                           migrate_data_marshaller_write_buffer_free,
>                                           red_char_device_write_buffer_ref(dev->priv->cur_write_buf)
>                                           );
> -        *write_to_dev_size_ptr += buf_remaining;
> +        write_to_dev_size += buf_remaining;
>          if (dev->priv->cur_write_buf->priv->origin == WRITE_BUFFER_ORIGIN_CLIENT) {
>              spice_assert(dev->priv->cur_write_buf->priv->client == dev_client->client);
> -            (*write_to_dev_tokens_ptr) += dev->priv->cur_write_buf->priv->token_price;
> +            write_to_dev_tokens += dev->priv->cur_write_buf->priv->token_price;
>          }
>      }
>  
> @@ -922,14 +922,16 @@ void red_char_device_migrate_data_marshall(RedCharDevice *dev,
>                                           migrate_data_marshaller_write_buffer_free,
>                                           red_char_device_write_buffer_ref(write_buf)
>                                           );
> -        *write_to_dev_size_ptr += write_buf->buf_used;
> +        write_to_dev_size += write_buf->buf_used;
>          if (write_buf->priv->origin == WRITE_BUFFER_ORIGIN_CLIENT) {
>              spice_assert(write_buf->priv->client == dev_client->client);
> -            (*write_to_dev_tokens_ptr) += write_buf->priv->token_price;
> +            write_to_dev_tokens += write_buf->priv->token_price;
>          }
>      }
>      spice_debug("migration data dev %p: write_queue size %u tokens %u",
> -                dev, *write_to_dev_size_ptr, *write_to_dev_tokens_ptr);
> +                dev, write_to_dev_size, write_to_dev_tokens);
> +    spice_marshaller_set_uint32(m, write_to_dev_sizes_ptr, write_to_dev_size);
> +    spice_marshaller_set_uint32(m, write_to_dev_sizes_ptr + sizeof(uint32_t), write_to_dev_tokens);
>  }
>  
>  bool red_char_device_restore(RedCharDevice *dev,
> -- 
> 2.14.3
> 
> _______________________________________________
> Spice-devel mailing list
> Spice-devel at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/spice-devel
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: not available
URL: <https://lists.freedesktop.org/archives/spice-devel/attachments/20180131/d44588a0/attachment.sig>


More information about the Spice-devel mailing list