Messages in this thread Patches in this message |  | | | Date | Fri, 9 Jun 2006 11:45:06 +0800 | | From | "Luke Yang" <> | | Subject | Re: [PATCH] Fix an inproper alignment accessing in irda protocol stack |
| |
Hi Andrew,
Thanks. I modified the patch (don't know if there is any way better to solve this).
Signed-off-by: Luke Yang <luke.adi@gmail.com>
irlmp.c | 8 +++++++- 1 files changed, 7 insertions(+), 1 deletion(-) --- net/irda/irlmp.c.old 2006-06-08 14:49:20.000000000 +0800 +++ net/irda/irlmp.c 2006-06-09 19:43:58.000000000 +0800 @@ -849,7 +849,13 @@ }
/* Construct new discovery info to be used by IrLAP, */ - u16ho(irlmp->discovery_cmd.data.hints) = irlmp->hints.word; +#ifdef __LITTLE_ENDIAN + irlmp->discovery_cmd.data.hints[0] = irlmp->hints.word & 0xff; + irlmp->discovery_cmd.data.hints[1] = (irlmp->hints.word & 0xff00) >> 8; +#else /* ifdef __BIG_ENDIAN */ + irlmp->discovery_cmd.data.hints[0] = (irlmp->hints.word & 0xff00) >> 8; + irlmp->discovery_cmd.data.hints[1] = irlmp->hints.word & 0xff; +#endif
/* * Set character set for device name (we use ASCII), and On 6/8/06, Andrew Morton <akpm@osdl.org> wrote: > On Thu, 8 Jun 2006 15:15:11 +0800 > "Luke Yang" <luke.adi@gmail.com> wrote: > > > Hi all, > > > > For "struct irda_device_info" in irda.h: > > struct irda_device_info { > > __u32 saddr; /* Address of local interface */ > > __u32 daddr; /* Address of remote device */ > > char info[22]; /* Description */ > > __u8 charset; /* Charset used for description */ > > __u8 hints[2]; /* Hint bits */ > > }; > > The "hints" member aligns at the third byte of a word, an odd > > address. So if we visit "hints" as a short in irlmp.c: > > > > u16ho(irlmp->discovery_cmd.data.hints) = irlmp->hints.word; > > > > will cause alignment problem on some machines. Architectures with > > strict alignment rules do not allow 16-bit read on an odd address. > > > > Signed-off-by: Luke Yang <luke.adi@gmail.com> > > > > irlmp.c | 3 ++- > > 1 files changed, 2 insertions(+), 1 deletion(-) > > > > --- net/irda/irlmp.c.old 2006-06-08 14:49:20.000000000 +0800 > > +++ net/irda/irlmp.c 2006-06-08 14:54:29.000000000 +0800 > > @@ -849,7 +849,8 @@ > > } > > > > /* Construct new discovery info to be used by IrLAP, */ > > - u16ho(irlmp->discovery_cmd.data.hints) = irlmp->hints.word; > > + irlmp->discovery_cmd.data.hints[0] = irlmp->hints.word & 0xff; > > + irlmp->discovery_cmd.data.hints[1] = (irlmp->hints.word & 0xff00) >> 8; > > This change will have the effect of swapping those two bytes on big-endian > machines. > >
-- Best regards, Luke Yang luke.adi@gmail.com --- net/irda/irlmp.c.old 2006-06-08 14:49:20.000000000 +0800 +++ net/irda/irlmp.c 2006-06-09 19:43:58.000000000 +0800 @@ -849,7 +849,13 @@ } /* Construct new discovery info to be used by IrLAP, */ - u16ho(irlmp->discovery_cmd.data.hints) = irlmp->hints.word; +#ifdef __LITTLE_ENDIAN + irlmp->discovery_cmd.data.hints[0] = irlmp->hints.word & 0xff; + irlmp->discovery_cmd.data.hints[1] = (irlmp->hints.word & 0xff00) >> 8; +#else /* ifdef __BIG_ENDIAN */ + irlmp->discovery_cmd.data.hints[0] = (irlmp->hints.word & 0xff00) >> 8; + irlmp->discovery_cmd.data.hints[1] = irlmp->hints.word & 0xff; +#endif /* * Set character set for device name (we use ASCII), and |  |