[avahi] arm memory alignment problems

Lennart Poettering lennart at poettering.de
Fri Sep 23 06:36:23 PDT 2005


On Fri, 23.09.05 10:53, pHilipp Zabel (philipp.zabel at gmail.com) wrote:

> > The pointer d is not necessarily aligned to 32bit multiples. The fix
> > is easy: just write all four bytes of the uint32_t value seperately
> > and manually to the memory d points to.
> 
> Do you mean something like this?
> 
> uint8_t *avahi_dns_packet_append_uint32(AvahiDnsPacket *p, uint32_t v) {
>     uint8_t *d;
>     uint32_t tmp_v;
>     assert(p);
> 
>     if (!(d = avahi_dns_packet_extend(p, sizeof(uint32_t))))
>         return NULL;
> 
>     tmp_v = htonl(v);
>     d[0] = tmp_v & 0xFF000000 >> 24;
>     d[1] = tmp_v & 0xFF0000 >> 16;
>     d[2] = tmp_v & 0xFF00 >> 8;
>     d[3] = tmp_v & 0xFF;
> 
>     return d;
> }

No, this is bogus. If you write the bytes one-by-one to the memory you
should not call htonl() first. In addition I am wondering why the
compiler doesn't complain about the fact that you assign an uint32_t
to an uint8_t variable.

Unless I mixed up LE with BE, this should do it:

d[0] = (uint8_t) (v >> 24);
d[1] = (uint8_t) (v >> 16);
d[2] = (uint8_t) (v >> 8);
d[3] = (uint8_t) v;

Lennart

-- 
Lennart Poettering; lennart [at] poettering [dot] de
ICQ# 11060553; GPG 0x1A015CC4; http://0pointer.de/lennart/


More information about the avahi mailing list