[Spice-devel] [PATCH spice-common v2] Fix generation of Smartcard channel
Christophe Fergeau
cfergeau at redhat.com
Thu May 17 09:26:17 UTC 2018
Acked-by: Christophe Fergeau <cfergeau at redhat.com>
On Wed, May 16, 2018 at 06:00:35PM +0100, Frediano Ziglio wrote:
> The Smartcard channel definition has been always broken.
> Multiple client messages with the same ID are defined in the channel.
> This cause on server demarshaller to only have last message defined,
> while on the client marshaller code all message marshallers are
> defined but client uses only header message.
>
> Following the difference of the generated code.
>
> diff -rup old/generated_client_marshallers.c common/generated_client_marshallers.c
> --- old/generated_client_marshallers.c 2018-05-14 22:49:07.641778414 +0100
> +++ common/generated_client_marshallers.c 2018-05-14 22:49:22.266329296 +0100
> @@ -389,27 +389,6 @@ static void spice_marshall_msgc_tunnel_s
> }
>
> #ifdef USE_SMARTCARD
> -static void spice_marshall_msgc_smartcard_data(SPICE_GNUC_UNUSED SpiceMarshaller *m, SPICE_GNUC_UNUSED SpiceMsgcSmartcard *msg, SpiceMarshaller **reader_name_out)
> -{
> - SPICE_GNUC_UNUSED SpiceMarshaller *m2;
> - SpiceMsgcSmartcard *src;
> - *reader_name_out = NULL;
> - src = (SpiceMsgcSmartcard *)msg;
> -
> - /* header */ {
> - spice_marshaller_add_uint32(m, src->header.type);
> - spice_marshaller_add_uint32(m, src->header.reader_id);
> - spice_marshaller_add_uint32(m, src->header.length);
> - }
> - if (src->header.type == SPICE_VSC_MESSAGE_TYPE_ReaderAdd) {
> - /* Don't marshall @nomarshal reader_name */
> - } else if (src->header.type == SPICE_VSC_MESSAGE_TYPE_ATR || src->header.type == SPICE_VSC_MESSAGE_TYPE_APDU) {
> - /* Remaining data must be appended manually */
> - } else if (src->header.type == SPICE_VSC_MESSAGE_TYPE_Error) {
> - spice_marshaller_add_uint32(m, src->error.code);
> - }
> -}
> -
> static void spice_marshall_msgc_smartcard_header(SPICE_GNUC_UNUSED SpiceMarshaller *m, SPICE_GNUC_UNUSED VSCMsgHeader *msg)
> {
> SPICE_GNUC_UNUSED SpiceMarshaller *m2;
> @@ -421,25 +400,6 @@ static void spice_marshall_msgc_smartcar
> spice_marshaller_add_uint32(m, src->length);
> }
>
> -static void spice_marshall_msgc_smartcard_error(SPICE_GNUC_UNUSED SpiceMarshaller *m, SPICE_GNUC_UNUSED VSCMsgError *msg)
> -{
> - SPICE_GNUC_UNUSED SpiceMarshaller *m2;
> - VSCMsgError *src;
> - src = (VSCMsgError *)msg;
> -
> - spice_marshaller_add_uint32(m, src->code);
> -}
> -
> -static void spice_marshall_msgc_smartcard_atr(SPICE_GNUC_UNUSED SpiceMarshaller *m, SPICE_GNUC_UNUSED VSCMsgATR *msg)
> -{
> - SPICE_GNUC_UNUSED SpiceMarshaller *m2;
> -}
> -
> -static void spice_marshall_msgc_smartcard_reader_add(SPICE_GNUC_UNUSED SpiceMarshaller *m, SPICE_GNUC_UNUSED VSCMsgReaderAdd *msg)
> -{
> - SPICE_GNUC_UNUSED SpiceMarshaller *m2;
> -}
> -
> #endif /* USE_SMARTCARD */
> static void spice_marshall_SpiceMsgCompressedData(SPICE_GNUC_UNUSED SpiceMarshaller *m, SPICE_GNUC_UNUSED SpiceMsgCompressedData *msg)
> {
> @@ -496,20 +456,8 @@ SpiceMessageMarshallers * spice_message_
> marshallers.msgc_record_mode = spice_marshall_msgc_record_mode;
> marshallers.msgc_record_start_mark = spice_marshall_msgc_record_start_mark;
> #ifdef USE_SMARTCARD
> - marshallers.msgc_smartcard_atr = spice_marshall_msgc_smartcard_atr;
> -#endif /* USE_SMARTCARD */
> -#ifdef USE_SMARTCARD
> - marshallers.msgc_smartcard_data = spice_marshall_msgc_smartcard_data;
> -#endif /* USE_SMARTCARD */
> -#ifdef USE_SMARTCARD
> - marshallers.msgc_smartcard_error = spice_marshall_msgc_smartcard_error;
> -#endif /* USE_SMARTCARD */
> -#ifdef USE_SMARTCARD
> marshallers.msgc_smartcard_header = spice_marshall_msgc_smartcard_header;
> #endif /* USE_SMARTCARD */
> -#ifdef USE_SMARTCARD
> - marshallers.msgc_smartcard_reader_add = spice_marshall_msgc_smartcard_reader_add;
> -#endif /* USE_SMARTCARD */
> marshallers.msgc_tunnel_service_add = spice_marshall_msgc_tunnel_service_add;
> marshallers.msgc_tunnel_service_remove = spice_marshall_msgc_tunnel_service_remove;
> marshallers.msgc_tunnel_socket_closed = spice_marshall_msgc_tunnel_socket_closed;
> diff -rup old/generated_client_marshallers.h common/generated_client_marshallers.h
> --- old/generated_client_marshallers.h 2018-05-14 22:49:07.641778414 +0100
> +++ common/generated_client_marshallers.h 2018-05-14 22:49:22.739358627 +0100
> @@ -61,11 +61,7 @@ typedef struct {
> void (*msgc_tunnel_socket_data)(SpiceMarshaller *m, SpiceMsgcTunnelSocketData *msg);
> void (*msgc_tunnel_socket_token)(SpiceMarshaller *m, SpiceMsgcTunnelSocketTokens *msg);
> #ifdef USE_SMARTCARD
> - void (*msgc_smartcard_data)(SpiceMarshaller *m, SpiceMsgcSmartcard *msg, SpiceMarshaller **reader_name_out);
> void (*msgc_smartcard_header)(SpiceMarshaller *m, VSCMsgHeader *msg);
> - void (*msgc_smartcard_error)(SpiceMarshaller *m, VSCMsgError *msg);
> - void (*msgc_smartcard_atr)(SpiceMarshaller *m, VSCMsgATR *msg);
> - void (*msgc_smartcard_reader_add)(SpiceMarshaller *m, VSCMsgReaderAdd *msg);
> #endif /* USE_SMARTCARD */
> void (*msg_SpiceMsgCompressedData)(SpiceMarshaller *m, SpiceMsgCompressedData *msg);
> void (*msgc_port_event)(SpiceMarshaller *m, SpiceMsgcPortEvent *msg);
> Only in common/: generated_client_marshallers.lo
> diff -rup old/generated_server_demarshallers.c common/generated_server_demarshallers.c
> --- old/generated_server_demarshallers.c 2018-05-14 22:49:07.641778414 +0100
> +++ common/generated_server_demarshallers.c 2018-05-14 22:49:23.498405695 +0100
> @@ -1957,24 +1957,18 @@ static uint8_t * parse_TunnelChannel_msg
>
> #ifdef USE_SMARTCARD
>
> -static uint8_t * parse_msgc_smartcard_reader_add(uint8_t *message_start, uint8_t *message_end, SPICE_GNUC_UNUSED int minor, size_t *size, message_destructor_t *free_message)
> +static uint8_t * parse_msgc_smartcard_header(uint8_t *message_start, uint8_t *message_end, SPICE_GNUC_UNUSED int minor, size_t *size, message_destructor_t *free_message)
> {
> SPICE_GNUC_UNUSED uint8_t *pos;
> uint8_t *start = message_start;
> uint8_t *data = NULL;
> uint64_t nw_size;
> + uint64_t mem_size;
> uint8_t *in, *end;
> - uint64_t reader_name__nw_size;
> - uint64_t reader_name__nelements;
> - VSCMsgReaderAdd *out;
> + VSCMsgHeader *out;
>
> - { /* reader_name */
> - reader_name__nelements = message_end - (start + 0);
> -
> - reader_name__nw_size = reader_name__nelements;
> - }
> -
> - nw_size = 0 + reader_name__nw_size;
> + nw_size = 12;
> + mem_size = sizeof(VSCMsgHeader);
>
> /* Check if message fits in reported side */
> if (nw_size > (uintptr_t) (message_end - start)) {
> @@ -1986,13 +1980,14 @@ static uint8_t * parse_msgc_smartcard_re
> if (SPICE_UNLIKELY(data == NULL)) {
> goto error;
> }
> - end = data + sizeof(VSCMsgReaderAdd);
> + end = data + sizeof(VSCMsgHeader);
> in = start;
>
> - out = (VSCMsgReaderAdd *)data;
> + out = (VSCMsgHeader *)data;
>
> - memcpy(out->reader_name, in, reader_name__nelements);
> - in += reader_name__nelements;
> + out->type = consume_uint32(&in);
> + out->reader_id = consume_uint32(&in);
> + out->length = consume_uint32(&in);
>
> assert(in <= message_end);
> assert(end <= data + mem_size);
> @@ -2017,7 +2012,7 @@ static uint8_t * parse_SmartcardChannel_
> parse_msgc_disconnecting
> };
> static parse_msg_func_t funcs2[1] = {
> - parse_msgc_smartcard_reader_add
> + parse_msgc_smartcard_header
> };
> if (message_type >= 1 && message_type < 7) {
> return funcs1[message_type-1](message_start, message_end, minor, size_out, free_message);
>
> Signed-off-by: Frediano Ziglio <fziglio at redhat.com>
> ---
> spice.proto | 12 ++++++++++--
> 1 file changed, 10 insertions(+), 2 deletions(-)
>
> Changes since v1:
> - remove spurious changes.
>
> diff --git a/spice.proto b/spice.proto
> index 4d916bb..69f169e 100644
> --- a/spice.proto
> +++ b/spice.proto
> @@ -1400,6 +1400,12 @@ channel SmartcardChannel : BaseChannel {
> } @ctype(SpiceMsgSmartcard) data = 101;
>
> client:
> +/* Some of the following messages are duplicated, the protocol
> + * definition was broken. Messages, as you can see have same ID.
> + * Also code was not used and didn't compile correctly.
> + * Keeping in the hope could be useful in the future.
> + */
> +/*
> message {
> VscMessageHeader header;
> switch (header.type) {
> @@ -1412,13 +1418,14 @@ channel SmartcardChannel : BaseChannel {
> VscMessageError error;
> } u @anon;
> } @ctype(SpiceMsgcSmartcard) data = 101;
> -
> +*/
> message {
> vsc_message_type type;
> uint32 reader_id;
> uint32 length;
> } @ctype(VSCMsgHeader) header = 101;
> -
> +/* See comment on client data message above */
> +/*
> message {
> uint32 code;
> } @ctype(VSCMsgError) error = 101;
> @@ -1430,6 +1437,7 @@ channel SmartcardChannel : BaseChannel {
> message {
> int8 reader_name[] @zero_terminated @nonnull;
> } @ctype(VSCMsgReaderAdd) reader_add = 101;
> +*/
> } @ifdef(USE_SMARTCARD);
>
> channel SpicevmcChannel : BaseChannel {
> --
> 2.17.0
>
> _______________________________________________
> 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/20180517/5e22d01f/attachment.sig>
More information about the Spice-devel
mailing list