diff options
author | Anish Bhatt <anish@chelsio.com> | 2015-02-18 18:29:45 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2015-02-20 17:25:52 -0500 |
commit | 5a8eeec468f229558322926f28c61bb0769793e9 (patch) | |
tree | 139ec1c0f2383dd6aa4a07366ede5bd85463e324 /drivers/net/ethernet/chelsio/cxgb4/clip_tbl.c | |
parent | 65e9256c4ec569ed62bb89023daab7b72368b89f (diff) |
cxgb4: Fix incorrect 'c' suffix to %pI4, use %pISc instead
Issue caught by 0-day kernel test infrastructure. Code changed to use sockaddr
members so that %pISc can be used instead.
Fixes: b5a02f503caa ('cxgb4 : Update ipv6 address handling api')
Signed-off-by: Anish Bhatt <anish@chelsio.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/ethernet/chelsio/cxgb4/clip_tbl.c')
-rw-r--r-- | drivers/net/ethernet/chelsio/cxgb4/clip_tbl.c | 57 |
1 files changed, 29 insertions, 28 deletions
diff --git a/drivers/net/ethernet/chelsio/cxgb4/clip_tbl.c b/drivers/net/ethernet/chelsio/cxgb4/clip_tbl.c index 9062a8434246..c308429dd9c7 100644 --- a/drivers/net/ethernet/chelsio/cxgb4/clip_tbl.c +++ b/drivers/net/ethernet/chelsio/cxgb4/clip_tbl.c | |||
@@ -35,10 +35,10 @@ static inline unsigned int ipv6_clip_hash(struct clip_tbl *d, const u32 *key) | |||
35 | } | 35 | } |
36 | 36 | ||
37 | static unsigned int clip_addr_hash(struct clip_tbl *ctbl, const u32 *addr, | 37 | static unsigned int clip_addr_hash(struct clip_tbl *ctbl, const u32 *addr, |
38 | int addr_len) | 38 | u8 v6) |
39 | { | 39 | { |
40 | return addr_len == 4 ? ipv4_clip_hash(ctbl, addr) : | 40 | return v6 ? ipv6_clip_hash(ctbl, addr) : |
41 | ipv6_clip_hash(ctbl, addr); | 41 | ipv4_clip_hash(ctbl, addr); |
42 | } | 42 | } |
43 | 43 | ||
44 | static int clip6_get_mbox(const struct net_device *dev, | 44 | static int clip6_get_mbox(const struct net_device *dev, |
@@ -78,23 +78,22 @@ int cxgb4_clip_get(const struct net_device *dev, const u32 *lip, u8 v6) | |||
78 | struct clip_entry *ce, *cte; | 78 | struct clip_entry *ce, *cte; |
79 | u32 *addr = (u32 *)lip; | 79 | u32 *addr = (u32 *)lip; |
80 | int hash; | 80 | int hash; |
81 | int addr_len; | 81 | int ret = -1; |
82 | int ret = 0; | ||
83 | 82 | ||
84 | if (!ctbl) | 83 | if (!ctbl) |
85 | return 0; | 84 | return 0; |
86 | 85 | ||
87 | if (v6) | 86 | hash = clip_addr_hash(ctbl, addr, v6); |
88 | addr_len = 16; | ||
89 | else | ||
90 | addr_len = 4; | ||
91 | |||
92 | hash = clip_addr_hash(ctbl, addr, addr_len); | ||
93 | 87 | ||
94 | read_lock_bh(&ctbl->lock); | 88 | read_lock_bh(&ctbl->lock); |
95 | list_for_each_entry(cte, &ctbl->hash_list[hash], list) { | 89 | list_for_each_entry(cte, &ctbl->hash_list[hash], list) { |
96 | if (addr_len == cte->addr_len && | 90 | if (cte->addr6.sin6_family == AF_INET6 && v6) |
97 | memcmp(lip, cte->addr, cte->addr_len) == 0) { | 91 | ret = memcmp(lip, cte->addr6.sin6_addr.s6_addr, |
92 | sizeof(struct in6_addr)); | ||
93 | else if (cte->addr.sin_family == AF_INET && !v6) | ||
94 | ret = memcmp(lip, (char *)(&cte->addr.sin_addr), | ||
95 | sizeof(struct in_addr)); | ||
96 | if (!ret) { | ||
98 | ce = cte; | 97 | ce = cte; |
99 | read_unlock_bh(&ctbl->lock); | 98 | read_unlock_bh(&ctbl->lock); |
100 | goto found; | 99 | goto found; |
@@ -111,15 +110,20 @@ int cxgb4_clip_get(const struct net_device *dev, const u32 *lip, u8 v6) | |||
111 | spin_lock_init(&ce->lock); | 110 | spin_lock_init(&ce->lock); |
112 | atomic_set(&ce->refcnt, 0); | 111 | atomic_set(&ce->refcnt, 0); |
113 | atomic_dec(&ctbl->nfree); | 112 | atomic_dec(&ctbl->nfree); |
114 | ce->addr_len = addr_len; | ||
115 | memcpy(ce->addr, lip, addr_len); | ||
116 | list_add_tail(&ce->list, &ctbl->hash_list[hash]); | 113 | list_add_tail(&ce->list, &ctbl->hash_list[hash]); |
117 | if (v6) { | 114 | if (v6) { |
115 | ce->addr6.sin6_family = AF_INET6; | ||
116 | memcpy(ce->addr6.sin6_addr.s6_addr, | ||
117 | lip, sizeof(struct in6_addr)); | ||
118 | ret = clip6_get_mbox(dev, (const struct in6_addr *)lip); | 118 | ret = clip6_get_mbox(dev, (const struct in6_addr *)lip); |
119 | if (ret) { | 119 | if (ret) { |
120 | write_unlock_bh(&ctbl->lock); | 120 | write_unlock_bh(&ctbl->lock); |
121 | return ret; | 121 | return ret; |
122 | } | 122 | } |
123 | } else { | ||
124 | ce->addr.sin_family = AF_INET; | ||
125 | memcpy((char *)(&ce->addr.sin_addr), lip, | ||
126 | sizeof(struct in_addr)); | ||
123 | } | 127 | } |
124 | } else { | 128 | } else { |
125 | write_unlock_bh(&ctbl->lock); | 129 | write_unlock_bh(&ctbl->lock); |
@@ -140,19 +144,19 @@ void cxgb4_clip_release(const struct net_device *dev, const u32 *lip, u8 v6) | |||
140 | struct clip_entry *ce, *cte; | 144 | struct clip_entry *ce, *cte; |
141 | u32 *addr = (u32 *)lip; | 145 | u32 *addr = (u32 *)lip; |
142 | int hash; | 146 | int hash; |
143 | int addr_len; | 147 | int ret = -1; |
144 | |||
145 | if (v6) | ||
146 | addr_len = 16; | ||
147 | else | ||
148 | addr_len = 4; | ||
149 | 148 | ||
150 | hash = clip_addr_hash(ctbl, addr, addr_len); | 149 | hash = clip_addr_hash(ctbl, addr, v6); |
151 | 150 | ||
152 | read_lock_bh(&ctbl->lock); | 151 | read_lock_bh(&ctbl->lock); |
153 | list_for_each_entry(cte, &ctbl->hash_list[hash], list) { | 152 | list_for_each_entry(cte, &ctbl->hash_list[hash], list) { |
154 | if (addr_len == cte->addr_len && | 153 | if (cte->addr6.sin6_family == AF_INET6 && v6) |
155 | memcmp(lip, cte->addr, cte->addr_len) == 0) { | 154 | ret = memcmp(lip, cte->addr6.sin6_addr.s6_addr, |
155 | sizeof(struct in6_addr)); | ||
156 | else if (cte->addr.sin_family == AF_INET && !v6) | ||
157 | ret = memcmp(lip, (char *)(&cte->addr.sin_addr), | ||
158 | sizeof(struct in_addr)); | ||
159 | if (!ret) { | ||
156 | ce = cte; | 160 | ce = cte; |
157 | read_unlock_bh(&ctbl->lock); | 161 | read_unlock_bh(&ctbl->lock); |
158 | goto found; | 162 | goto found; |
@@ -249,10 +253,7 @@ int clip_tbl_show(struct seq_file *seq, void *v) | |||
249 | for (i = 0 ; i < ctbl->clipt_size; ++i) { | 253 | for (i = 0 ; i < ctbl->clipt_size; ++i) { |
250 | list_for_each_entry(ce, &ctbl->hash_list[i], list) { | 254 | list_for_each_entry(ce, &ctbl->hash_list[i], list) { |
251 | ip[0] = '\0'; | 255 | ip[0] = '\0'; |
252 | if (ce->addr_len == 16) | 256 | sprintf(ip, "%pISc", &ce->addr); |
253 | sprintf(ip, "%pI6c", ce->addr); | ||
254 | else | ||
255 | sprintf(ip, "%pI4c", ce->addr); | ||
256 | seq_printf(seq, "%-25s %u\n", ip, | 257 | seq_printf(seq, "%-25s %u\n", ip, |
257 | atomic_read(&ce->refcnt)); | 258 | atomic_read(&ce->refcnt)); |
258 | } | 259 | } |