diff options
author | Graf Yang <graf.yang@analog.com> | 2008-05-14 02:25:57 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2008-05-14 02:25:57 -0400 |
commit | 332223831e86b2e17b48b4afafad07d8e3b73861 (patch) | |
tree | a3bd42005c91888c3cb20ec0ca6880e3181e7acb /net/irda | |
parent | c1cc678adaa78ae2aab6a6d699241ad516d84476 (diff) |
irda: Fix a misalign access issue. (v2)
Replace u16ho with put/get_unaligned functions
Signed-off-by: Graf Yang <graf.yang@analog.com>
Signed-off-by: Bryan Wu <cooloney@kernel.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/irda')
-rw-r--r-- | net/irda/discovery.c | 8 | ||||
-rw-r--r-- | net/irda/irlmp.c | 5 | ||||
-rw-r--r-- | net/irda/irnet/irnet_irda.c | 4 |
3 files changed, 10 insertions, 7 deletions
diff --git a/net/irda/discovery.c b/net/irda/discovery.c index bfacef8b76f4..a6f99b5a1499 100644 --- a/net/irda/discovery.c +++ b/net/irda/discovery.c | |||
@@ -40,6 +40,8 @@ | |||
40 | 40 | ||
41 | #include <net/irda/discovery.h> | 41 | #include <net/irda/discovery.h> |
42 | 42 | ||
43 | #include <asm/unaligned.h> | ||
44 | |||
43 | /* | 45 | /* |
44 | * Function irlmp_add_discovery (cachelog, discovery) | 46 | * Function irlmp_add_discovery (cachelog, discovery) |
45 | * | 47 | * |
@@ -87,7 +89,7 @@ void irlmp_add_discovery(hashbin_t *cachelog, discovery_t *new) | |||
87 | */ | 89 | */ |
88 | hashbin_remove_this(cachelog, (irda_queue_t *) node); | 90 | hashbin_remove_this(cachelog, (irda_queue_t *) node); |
89 | /* Check if hints bits are unchanged */ | 91 | /* Check if hints bits are unchanged */ |
90 | if(u16ho(node->data.hints) == u16ho(new->data.hints)) | 92 | if (get_unaligned((__u16 *)node->data.hints) == get_unaligned((__u16 *)new->data.hints)) |
91 | /* Set time of first discovery for this node */ | 93 | /* Set time of first discovery for this node */ |
92 | new->firststamp = node->firststamp; | 94 | new->firststamp = node->firststamp; |
93 | kfree(node); | 95 | kfree(node); |
@@ -281,9 +283,9 @@ struct irda_device_info *irlmp_copy_discoveries(hashbin_t *log, int *pn, | |||
281 | /* Mask out the ones we don't want : | 283 | /* Mask out the ones we don't want : |
282 | * We want to match the discovery mask, and to get only | 284 | * We want to match the discovery mask, and to get only |
283 | * the most recent one (unless we want old ones) */ | 285 | * the most recent one (unless we want old ones) */ |
284 | if ((u16ho(discovery->data.hints) & mask) && | 286 | if ((get_unaligned((__u16 *)discovery->data.hints) & mask) && |
285 | ((old_entries) || | 287 | ((old_entries) || |
286 | ((jiffies - discovery->firststamp) < j_timeout)) ) { | 288 | ((jiffies - discovery->firststamp) < j_timeout))) { |
287 | /* Create buffer as needed. | 289 | /* Create buffer as needed. |
288 | * As this function get called a lot and most time | 290 | * As this function get called a lot and most time |
289 | * we don't have anything to put in the log (we are | 291 | * we don't have anything to put in the log (we are |
diff --git a/net/irda/irlmp.c b/net/irda/irlmp.c index 1f81f8e7c61d..7bf5b913828b 100644 --- a/net/irda/irlmp.c +++ b/net/irda/irlmp.c | |||
@@ -1062,7 +1062,8 @@ void irlmp_discovery_expiry(discinfo_t *expiries, int number) | |||
1062 | for(i = 0; i < number; i++) { | 1062 | for(i = 0; i < number; i++) { |
1063 | /* Check if we should notify client */ | 1063 | /* Check if we should notify client */ |
1064 | if ((client->expir_callback) && | 1064 | if ((client->expir_callback) && |
1065 | (client->hint_mask.word & u16ho(expiries[i].hints) | 1065 | (client->hint_mask.word & |
1066 | get_unaligned((__u16 *)expiries[i].hints) | ||
1066 | & 0x7f7f) ) | 1067 | & 0x7f7f) ) |
1067 | client->expir_callback(&(expiries[i]), | 1068 | client->expir_callback(&(expiries[i]), |
1068 | EXPIRY_TIMEOUT, | 1069 | EXPIRY_TIMEOUT, |
@@ -1086,7 +1087,7 @@ discovery_t *irlmp_get_discovery_response(void) | |||
1086 | 1087 | ||
1087 | IRDA_ASSERT(irlmp != NULL, return NULL;); | 1088 | IRDA_ASSERT(irlmp != NULL, return NULL;); |
1088 | 1089 | ||
1089 | u16ho(irlmp->discovery_rsp.data.hints) = irlmp->hints.word; | 1090 | put_unaligned(irlmp->hints.word, (__u16 *)irlmp->discovery_rsp.data.hints); |
1090 | 1091 | ||
1091 | /* | 1092 | /* |
1092 | * Set character set for device name (we use ASCII), and | 1093 | * Set character set for device name (we use ASCII), and |
diff --git a/net/irda/irnet/irnet_irda.c b/net/irda/irnet/irnet_irda.c index 75497e55927d..a3ec0026cdb2 100644 --- a/net/irda/irnet/irnet_irda.c +++ b/net/irda/irnet/irnet_irda.c | |||
@@ -1673,7 +1673,7 @@ irnet_discovery_indication(discinfo_t * discovery, | |||
1673 | /* Notify the control channel */ | 1673 | /* Notify the control channel */ |
1674 | irnet_post_event(NULL, IRNET_DISCOVER, | 1674 | irnet_post_event(NULL, IRNET_DISCOVER, |
1675 | discovery->saddr, discovery->daddr, discovery->info, | 1675 | discovery->saddr, discovery->daddr, discovery->info, |
1676 | u16ho(discovery->hints)); | 1676 | get_unaligned((__u16 *)discovery->hints)); |
1677 | 1677 | ||
1678 | DEXIT(IRDA_OCB_TRACE, "\n"); | 1678 | DEXIT(IRDA_OCB_TRACE, "\n"); |
1679 | } | 1679 | } |
@@ -1704,7 +1704,7 @@ irnet_expiry_indication(discinfo_t * expiry, | |||
1704 | /* Notify the control channel */ | 1704 | /* Notify the control channel */ |
1705 | irnet_post_event(NULL, IRNET_EXPIRE, | 1705 | irnet_post_event(NULL, IRNET_EXPIRE, |
1706 | expiry->saddr, expiry->daddr, expiry->info, | 1706 | expiry->saddr, expiry->daddr, expiry->info, |
1707 | u16ho(expiry->hints)); | 1707 | get_unaligned((__u16 *)expiry->hints)); |
1708 | 1708 | ||
1709 | DEXIT(IRDA_OCB_TRACE, "\n"); | 1709 | DEXIT(IRDA_OCB_TRACE, "\n"); |
1710 | } | 1710 | } |