Commit 81dcd1690697efbdf8126e78fbbf7c76d359377f
Committed by
David S. Miller
1 parent
8d5cf596d1
[AX.25]: Fix unchecked ax25_listen_register uses
Fix ax25_listen_register to return something that's a sane error code, then all callers to use it. Signed-off-by: Ralf Baechle <ralf@linux-mips.org> Signed-off-by: David S. Miller <davem@davemloft.net>
Showing 3 changed files with 24 additions and 10 deletions Side-by-side Diff
net/ax25/ax25_iface.c
... | ... | @@ -154,7 +154,7 @@ |
154 | 154 | return 0; |
155 | 155 | |
156 | 156 | if ((listen = kmalloc(sizeof(*listen), GFP_ATOMIC)) == NULL) |
157 | - return 0; | |
157 | + return -ENOMEM; | |
158 | 158 | |
159 | 159 | listen->callsign = *callsign; |
160 | 160 | listen->dev = dev; |
... | ... | @@ -164,7 +164,7 @@ |
164 | 164 | listen_list = listen; |
165 | 165 | spin_unlock_bh(&listen_lock); |
166 | 166 | |
167 | - return 1; | |
167 | + return 0; | |
168 | 168 | } |
169 | 169 | |
170 | 170 | EXPORT_SYMBOL(ax25_listen_register); |
... | ... | @@ -225,7 +225,8 @@ |
225 | 225 | |
226 | 226 | spin_lock_bh(&listen_lock); |
227 | 227 | for (listen = listen_list; listen != NULL; listen = listen->next) |
228 | - if (ax25cmp(&listen->callsign, callsign) == 0 && (listen->dev == dev || listen->dev == NULL)) { | |
228 | + if (ax25cmp(&listen->callsign, callsign) == 0 && | |
229 | + (listen->dev == dev || listen->dev == NULL)) { | |
229 | 230 | spin_unlock_bh(&listen_lock); |
230 | 231 | return 1; |
231 | 232 | } |
net/netrom/nr_dev.c
... | ... | @@ -128,25 +128,37 @@ |
128 | 128 | return -37; |
129 | 129 | } |
130 | 130 | |
131 | -static int nr_set_mac_address(struct net_device *dev, void *addr) | |
131 | +static int __must_check nr_set_mac_address(struct net_device *dev, void *addr) | |
132 | 132 | { |
133 | 133 | struct sockaddr *sa = addr; |
134 | + int err; | |
134 | 135 | |
135 | - if (dev->flags & IFF_UP) | |
136 | + if (!memcmp(dev->dev_addr, sa->sa_data, dev->addr_len)) | |
137 | + return 0; | |
138 | + | |
139 | + if (dev->flags & IFF_UP) { | |
140 | + err = ax25_listen_register((ax25_address *)sa->sa_data, NULL); | |
141 | + if (err) | |
142 | + return err; | |
143 | + | |
136 | 144 | ax25_listen_release((ax25_address *)dev->dev_addr, NULL); |
145 | + } | |
137 | 146 | |
138 | 147 | memcpy(dev->dev_addr, sa->sa_data, dev->addr_len); |
139 | 148 | |
140 | - if (dev->flags & IFF_UP) | |
141 | - ax25_listen_register((ax25_address *)dev->dev_addr, NULL); | |
142 | - | |
143 | 149 | return 0; |
144 | 150 | } |
145 | 151 | |
146 | 152 | static int nr_open(struct net_device *dev) |
147 | 153 | { |
154 | + int err; | |
155 | + | |
156 | + err = ax25_listen_register((ax25_address *)dev->dev_addr, NULL); | |
157 | + if (err) | |
158 | + return err; | |
159 | + | |
148 | 160 | netif_start_queue(dev); |
149 | - ax25_listen_register((ax25_address *)dev->dev_addr, NULL); | |
161 | + | |
150 | 162 | return 0; |
151 | 163 | } |
152 | 164 |
net/rose/af_rose.c
... | ... | @@ -1314,7 +1314,8 @@ |
1314 | 1314 | if (copy_from_user(&rose_callsign, argp, sizeof(ax25_address))) |
1315 | 1315 | return -EFAULT; |
1316 | 1316 | if (ax25cmp(&rose_callsign, &null_ax25_address) != 0) |
1317 | - ax25_listen_register(&rose_callsign, NULL); | |
1317 | + return ax25_listen_register(&rose_callsign, NULL); | |
1318 | + | |
1318 | 1319 | return 0; |
1319 | 1320 | |
1320 | 1321 | case SIOCRSGL2CALL: |