@@ -275,6 +275,7 @@ static int llc_ui_autobind(struct socket *sock, struct sockaddr_llc *addr)
275
275
{
276
276
struct sock * sk = sock -> sk ;
277
277
struct llc_sock * llc = llc_sk (sk );
278
+ struct net_device * dev = NULL ;
278
279
struct llc_sap * sap ;
279
280
int rc = - EINVAL ;
280
281
@@ -286,16 +287,15 @@ static int llc_ui_autobind(struct socket *sock, struct sockaddr_llc *addr)
286
287
goto out ;
287
288
rc = - ENODEV ;
288
289
if (sk -> sk_bound_dev_if ) {
289
- llc -> dev = dev_get_by_index (& init_net , sk -> sk_bound_dev_if );
290
- if (llc -> dev && addr -> sllc_arphrd != llc -> dev -> type ) {
291
- dev_put (llc -> dev );
292
- llc -> dev = NULL ;
290
+ dev = dev_get_by_index (& init_net , sk -> sk_bound_dev_if );
291
+ if (dev && addr -> sllc_arphrd != dev -> type ) {
292
+ dev_put (dev );
293
+ dev = NULL ;
293
294
}
294
295
} else
295
- llc -> dev = dev_getfirstbyhwtype (& init_net , addr -> sllc_arphrd );
296
- if (!llc -> dev )
296
+ dev = dev_getfirstbyhwtype (& init_net , addr -> sllc_arphrd );
297
+ if (!dev )
297
298
goto out ;
298
- netdev_tracker_alloc (llc -> dev , & llc -> dev_tracker , GFP_KERNEL );
299
299
rc = - EUSERS ;
300
300
llc -> laddr .lsap = llc_ui_autoport ();
301
301
if (!llc -> laddr .lsap )
@@ -304,17 +304,20 @@ static int llc_ui_autobind(struct socket *sock, struct sockaddr_llc *addr)
304
304
sap = llc_sap_open (llc -> laddr .lsap , NULL );
305
305
if (!sap )
306
306
goto out ;
307
+
308
+ /* Note: We do not expect errors from this point. */
309
+ llc -> dev = dev ;
310
+ netdev_tracker_alloc (llc -> dev , & llc -> dev_tracker , GFP_KERNEL );
311
+ dev = NULL ;
312
+
307
313
memcpy (llc -> laddr .mac , llc -> dev -> dev_addr , IFHWADDRLEN );
308
314
memcpy (& llc -> addr , addr , sizeof (llc -> addr ));
309
315
/* assign new connection to its SAP */
310
316
llc_sap_add_socket (sap , sk );
311
317
sock_reset_flag (sk , SOCK_ZAPPED );
312
318
rc = 0 ;
313
319
out :
314
- if (rc ) {
315
- dev_put_track (llc -> dev , & llc -> dev_tracker );
316
- llc -> dev = NULL ;
317
- }
320
+ dev_put (dev );
318
321
return rc ;
319
322
}
320
323
@@ -337,6 +340,7 @@ static int llc_ui_bind(struct socket *sock, struct sockaddr *uaddr, int addrlen)
337
340
struct sockaddr_llc * addr = (struct sockaddr_llc * )uaddr ;
338
341
struct sock * sk = sock -> sk ;
339
342
struct llc_sock * llc = llc_sk (sk );
343
+ struct net_device * dev = NULL ;
340
344
struct llc_sap * sap ;
341
345
int rc = - EINVAL ;
342
346
@@ -352,25 +356,27 @@ static int llc_ui_bind(struct socket *sock, struct sockaddr *uaddr, int addrlen)
352
356
rc = - ENODEV ;
353
357
rcu_read_lock ();
354
358
if (sk -> sk_bound_dev_if ) {
355
- llc -> dev = dev_get_by_index_rcu (& init_net , sk -> sk_bound_dev_if );
356
- if (llc -> dev ) {
359
+ dev = dev_get_by_index_rcu (& init_net , sk -> sk_bound_dev_if );
360
+ if (dev ) {
357
361
if (is_zero_ether_addr (addr -> sllc_mac ))
358
- memcpy (addr -> sllc_mac , llc -> dev -> dev_addr ,
362
+ memcpy (addr -> sllc_mac , dev -> dev_addr ,
359
363
IFHWADDRLEN );
360
- if (addr -> sllc_arphrd != llc -> dev -> type ||
364
+ if (addr -> sllc_arphrd != dev -> type ||
361
365
!ether_addr_equal (addr -> sllc_mac ,
362
- llc -> dev -> dev_addr )) {
366
+ dev -> dev_addr )) {
363
367
rc = - EINVAL ;
364
- llc -> dev = NULL ;
368
+ dev = NULL ;
365
369
}
366
370
}
367
- } else
368
- llc -> dev = dev_getbyhwaddr_rcu (& init_net , addr -> sllc_arphrd ,
371
+ } else {
372
+ dev = dev_getbyhwaddr_rcu (& init_net , addr -> sllc_arphrd ,
369
373
addr -> sllc_mac );
370
- dev_hold_track (llc -> dev , & llc -> dev_tracker , GFP_ATOMIC );
374
+ }
375
+ dev_hold (dev );
371
376
rcu_read_unlock ();
372
- if (!llc -> dev )
377
+ if (!dev )
373
378
goto out ;
379
+
374
380
if (!addr -> sllc_sap ) {
375
381
rc = - EUSERS ;
376
382
addr -> sllc_sap = llc_ui_autoport ();
@@ -402,6 +408,12 @@ static int llc_ui_bind(struct socket *sock, struct sockaddr *uaddr, int addrlen)
402
408
goto out_put ;
403
409
}
404
410
}
411
+
412
+ /* Note: We do not expect errors from this point. */
413
+ llc -> dev = dev ;
414
+ netdev_tracker_alloc (llc -> dev , & llc -> dev_tracker , GFP_KERNEL );
415
+ dev = NULL ;
416
+
405
417
llc -> laddr .lsap = addr -> sllc_sap ;
406
418
memcpy (llc -> laddr .mac , addr -> sllc_mac , IFHWADDRLEN );
407
419
memcpy (& llc -> addr , addr , sizeof (llc -> addr ));
@@ -412,10 +424,7 @@ static int llc_ui_bind(struct socket *sock, struct sockaddr *uaddr, int addrlen)
412
424
out_put :
413
425
llc_sap_put (sap );
414
426
out :
415
- if (rc ) {
416
- dev_put_track (llc -> dev , & llc -> dev_tracker );
417
- llc -> dev = NULL ;
418
- }
427
+ dev_put (dev );
419
428
release_sock (sk );
420
429
return rc ;
421
430
}
0 commit comments