Hi,
Patrick Baggett:
> Could you explain the context around this code? Perhaps the source isThe context was misposted to bug report 731806 as message #87:
> not really "alignment safe" and could use some patching upstream? I'd
> be happy to provide advice or code samples.
https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=731806#87
(but not with Cc to debian-sparc list).
Upstream is myself. :))
The code in question is by my unreachable libburn predecessors, though.
It belongs to the preparation of a thread start for one of five
occasions in libburn. SIGBUS happens at
http://libburnia-project.org/browser/libburn/trunk/libburn/async.c#L149
The caller has a local struct (i.e. on stack) like (#L592, #L692):
struct write_opts write;
...
add_worker(Burnworker_type_writE, d,
(WorkerFunc) write_disc_worker_func, &o);
The called function gets its address as parameter "data" (#L135):
static void add_worker(int w_type, struct burn_drive *d,
WorkerFunc f, void *data)
has a struct on heap (#L102, #L138, #L146):
struct w_list{
...
union w_list_data
{
...
struct write_opts write;
...
} u;
}
...
struct w_list *a;
...
a = calloc(1, sizeof(struct w_list));
The gesture which causes the SIGBUS is (#L149)
a->u = *(union w_list_data *)data;
which is not what i personally would use, but should be fully legal
nevertheless.
The SIGBUS vanishes if i compile without gcc -O2, or if i replace
the "a->u =" gesture by
memcpy(&(a->u), data, sizeof(union w_list_data));
which i deem equivalent (and more my personal style).
Have a nice day :)
Thomas