aboutsummaryrefslogtreecommitdiffstats
path: root/net/x25
diff options
context:
space:
mode:
Diffstat (limited to 'net/x25')
-rw-r--r--net/x25/af_x25.c12
-rw-r--r--net/x25/x25_link.c8
2 files changed, 10 insertions, 10 deletions
diff --git a/net/x25/af_x25.c b/net/x25/af_x25.c
index 2351aceb296d..45be72c3f940 100644
--- a/net/x25/af_x25.c
+++ b/net/x25/af_x25.c
@@ -1415,17 +1415,13 @@ static int x25_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
1415 rc = x25_route_ioctl(cmd, argp); 1415 rc = x25_route_ioctl(cmd, argp);
1416 break; 1416 break;
1417 case SIOCX25GSUBSCRIP: 1417 case SIOCX25GSUBSCRIP:
1418 lock_kernel();
1419 rc = x25_subscr_ioctl(cmd, argp); 1418 rc = x25_subscr_ioctl(cmd, argp);
1420 unlock_kernel();
1421 break; 1419 break;
1422 case SIOCX25SSUBSCRIP: 1420 case SIOCX25SSUBSCRIP:
1423 rc = -EPERM; 1421 rc = -EPERM;
1424 if (!capable(CAP_NET_ADMIN)) 1422 if (!capable(CAP_NET_ADMIN))
1425 break; 1423 break;
1426 lock_kernel();
1427 rc = x25_subscr_ioctl(cmd, argp); 1424 rc = x25_subscr_ioctl(cmd, argp);
1428 unlock_kernel();
1429 break; 1425 break;
1430 case SIOCX25GFACILITIES: { 1426 case SIOCX25GFACILITIES: {
1431 struct x25_facilities fac = x25->facilities; 1427 struct x25_facilities fac = x25->facilities;
@@ -1646,16 +1642,20 @@ static int compat_x25_subscr_ioctl(unsigned int cmd,
1646 dev_put(dev); 1642 dev_put(dev);
1647 1643
1648 if (cmd == SIOCX25GSUBSCRIP) { 1644 if (cmd == SIOCX25GSUBSCRIP) {
1645 read_lock_bh(&x25_neigh_list_lock);
1649 x25_subscr.extended = nb->extended; 1646 x25_subscr.extended = nb->extended;
1650 x25_subscr.global_facil_mask = nb->global_facil_mask; 1647 x25_subscr.global_facil_mask = nb->global_facil_mask;
1648 read_unlock_bh(&x25_neigh_list_lock);
1651 rc = copy_to_user(x25_subscr32, &x25_subscr, 1649 rc = copy_to_user(x25_subscr32, &x25_subscr,
1652 sizeof(*x25_subscr32)) ? -EFAULT : 0; 1650 sizeof(*x25_subscr32)) ? -EFAULT : 0;
1653 } else { 1651 } else {
1654 rc = -EINVAL; 1652 rc = -EINVAL;
1655 if (x25_subscr.extended == 0 || x25_subscr.extended == 1) { 1653 if (x25_subscr.extended == 0 || x25_subscr.extended == 1) {
1656 rc = 0; 1654 rc = 0;
1655 write_lock_bh(&x25_neigh_list_lock);
1657 nb->extended = x25_subscr.extended; 1656 nb->extended = x25_subscr.extended;
1658 nb->global_facil_mask = x25_subscr.global_facil_mask; 1657 nb->global_facil_mask = x25_subscr.global_facil_mask;
1658 write_unlock_bh(&x25_neigh_list_lock);
1659 } 1659 }
1660 } 1660 }
1661 x25_neigh_put(nb); 1661 x25_neigh_put(nb);
@@ -1711,17 +1711,13 @@ static int compat_x25_ioctl(struct socket *sock, unsigned int cmd,
1711 rc = x25_route_ioctl(cmd, argp); 1711 rc = x25_route_ioctl(cmd, argp);
1712 break; 1712 break;
1713 case SIOCX25GSUBSCRIP: 1713 case SIOCX25GSUBSCRIP:
1714 lock_kernel();
1715 rc = compat_x25_subscr_ioctl(cmd, argp); 1714 rc = compat_x25_subscr_ioctl(cmd, argp);
1716 unlock_kernel();
1717 break; 1715 break;
1718 case SIOCX25SSUBSCRIP: 1716 case SIOCX25SSUBSCRIP:
1719 rc = -EPERM; 1717 rc = -EPERM;
1720 if (!capable(CAP_NET_ADMIN)) 1718 if (!capable(CAP_NET_ADMIN))
1721 break; 1719 break;
1722 lock_kernel();
1723 rc = compat_x25_subscr_ioctl(cmd, argp); 1720 rc = compat_x25_subscr_ioctl(cmd, argp);
1724 unlock_kernel();
1725 break; 1721 break;
1726 case SIOCX25GFACILITIES: 1722 case SIOCX25GFACILITIES:
1727 case SIOCX25SFACILITIES: 1723 case SIOCX25SFACILITIES:
diff --git a/net/x25/x25_link.c b/net/x25/x25_link.c
index 73e7b954ad28..4c81f6abb65b 100644
--- a/net/x25/x25_link.c
+++ b/net/x25/x25_link.c
@@ -31,8 +31,8 @@
31#include <linux/init.h> 31#include <linux/init.h>
32#include <net/x25.h> 32#include <net/x25.h>
33 33
34static LIST_HEAD(x25_neigh_list); 34LIST_HEAD(x25_neigh_list);
35static DEFINE_RWLOCK(x25_neigh_list_lock); 35DEFINE_RWLOCK(x25_neigh_list_lock);
36 36
37static void x25_t20timer_expiry(unsigned long); 37static void x25_t20timer_expiry(unsigned long);
38 38
@@ -360,16 +360,20 @@ int x25_subscr_ioctl(unsigned int cmd, void __user *arg)
360 dev_put(dev); 360 dev_put(dev);
361 361
362 if (cmd == SIOCX25GSUBSCRIP) { 362 if (cmd == SIOCX25GSUBSCRIP) {
363 read_lock_bh(&x25_neigh_list_lock);
363 x25_subscr.extended = nb->extended; 364 x25_subscr.extended = nb->extended;
364 x25_subscr.global_facil_mask = nb->global_facil_mask; 365 x25_subscr.global_facil_mask = nb->global_facil_mask;
366 read_unlock_bh(&x25_neigh_list_lock);
365 rc = copy_to_user(arg, &x25_subscr, 367 rc = copy_to_user(arg, &x25_subscr,
366 sizeof(x25_subscr)) ? -EFAULT : 0; 368 sizeof(x25_subscr)) ? -EFAULT : 0;
367 } else { 369 } else {
368 rc = -EINVAL; 370 rc = -EINVAL;
369 if (!(x25_subscr.extended && x25_subscr.extended != 1)) { 371 if (!(x25_subscr.extended && x25_subscr.extended != 1)) {
370 rc = 0; 372 rc = 0;
373 write_lock_bh(&x25_neigh_list_lock);
371 nb->extended = x25_subscr.extended; 374 nb->extended = x25_subscr.extended;
372 nb->global_facil_mask = x25_subscr.global_facil_mask; 375 nb->global_facil_mask = x25_subscr.global_facil_mask;
376 write_unlock_bh(&x25_neigh_list_lock);
373 } 377 }
374 } 378 }
375 x25_neigh_put(nb); 379 x25_neigh_put(nb);