Re: [head tinderbox] failure on ia64/ia64
Andrey Simonenko <[email protected]>
| Newsgroups | gmane.os.freebsd.devel.ia64 |
|---|---|
| Message-ID | <20110201102815.GA1953__33047.916511032$1296557738$gmane$org@pm513-1.comsys.ntu-kpi.kiev.ua> |
On Mon, Jan 31, 2011 at 04:56:06PM -0800, Marcel Moolenaar wrote:
>
> Take the statement at line 116 for example:
> *((int *)CMSG_DATA(cmsg)) = fd;
>
> We're effectively casting from a (char *) to a (int *) and then doing
> a 32-bit access (write). The easy fix (casting through (void *) is not
> possible, because you cannot guarantee that the address is properly
> aligned. cmsg points to memory set aside by the following local
> variable:
> unsigned char ctrl[CMSG_SPACE(sizeof(fd))];
>
> There's no guarantee that the compiler will align the character array
> at a 32-bit boundary (though in practice it seems to be). I have seen
> this kind of construct fail on ARM and PowerPC for example.
>
Why not to use such declaration:
union {
struct cmsghdr cm;
char ctrl[CMSG_SPACE(sizeof(fd))];
} control_un;
At least this is necessary to satisfy that CMSG_FIRSTHDR() will give
address of correctly aligned struct cmsghdr{}.
_______________________________________________
[email protected] mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-ia64
To unsubscribe, send any mail to "[email protected]"