Re: [dev] network protocol packing

From: Rob <robpilling_AT_gmail.com>
Date: Mon, 30 Jun 2014 20:34:01 +0100 (BST)

On 30/06/14, Markus Teich wrote:
> Heyho,

Hello there,

> since I did not find any suckless project regarding this issue, I
> would like to ask you guys for some feedback:
>
>
> unsigned char *msg;
> size_t msg_size;
> struct foo *msg_data;
> struct bar *msg_signature;
>
> msg_size = sizeof(unsigned char) // op
> + sizeof(struct foo) // data
> + sizeof(struct bar) // signature
> msg = malloc(msg_size);
>
> *msg = MSG_OP_SIGNED_DATA;
>
> msg_data = (struct foo *)(msg + 1);

You've got alignment issues here - msg will be aligned to support any
type (as malloc's interface specifies) so msg+1 will most likely be on
an odd address, one byte off a highly aligned address. This means if
your struct contains anything other than chars, you'll have UB. This is
fine on x86, which allows unaligned access with a performance penalty
but on something like an ARM machine you'll have issues.

You probably want to memcpy the struct in from an existing one.

> msg_data->field0 = bla;
> msg_data->field1 = blub;
>
> msg_signature = (struct bar *)(msg_data + 1);
> create_signature(msg, msg_signature);
>
> sendmsg(msg);
>
> free(msg);
>
>
> I feel it is pretty good already compared to other message packing
> I've seen, but do you know a way to make it suck even less?

Seems pretty straightforward otherwise :)

Cheers,
Rob
Received on Mon Jun 30 2014 - 21:34:01 CEST

This archive was generated by hypermail 2.3.0 : Mon Jun 30 2014 - 21:36:07 CEST