Commit 81dcd1690697efbdf8126e78fbbf7c76d359377f

Authored by Ralf Baechle
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 }
... ... @@ -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  
... ... @@ -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: