net: pass kern to net_proto_family create function
authorEric Paris <eparis@redhat.com>
Fri, 6 Nov 2009 06:18:14 +0000 (22:18 -0800)
committerDavid S. Miller <davem@davemloft.net>
Fri, 6 Nov 2009 06:18:14 +0000 (22:18 -0800)
The generic __sock_create function has a kern argument which allows the
security system to make decisions based on if a socket is being created by
the kernel or by userspace.  This patch passes that flag to the
net_proto_family specific create function, so it can do the same thing.

Signed-off-by: Eric Paris <eparis@redhat.com>
Acked-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
37 files changed:
drivers/isdn/mISDN/socket.c
drivers/net/pppox.c
include/linux/net.h
net/appletalk/ddp.c
net/atm/pvc.c
net/atm/svc.c
net/ax25/af_ax25.c
net/bluetooth/af_bluetooth.c
net/bluetooth/bnep/sock.c
net/bluetooth/cmtp/sock.c
net/bluetooth/hci_sock.c
net/bluetooth/hidp/sock.c
net/bluetooth/l2cap.c
net/bluetooth/rfcomm/sock.c
net/bluetooth/sco.c
net/can/af_can.c
net/decnet/af_decnet.c
net/econet/af_econet.c
net/ieee802154/af_ieee802154.c
net/ipv4/af_inet.c
net/ipv6/af_inet6.c
net/ipx/af_ipx.c
net/irda/af_irda.c
net/iucv/af_iucv.c
net/key/af_key.c
net/llc/af_llc.c
net/netlink/af_netlink.c
net/netrom/af_netrom.c
net/packet/af_packet.c
net/phonet/af_phonet.c
net/rds/af_rds.c
net/rose/af_rose.c
net/rxrpc/af_rxrpc.c
net/socket.c
net/tipc/socket.c
net/unix/af_unix.c
net/x25/af_x25.c

index 28182ed8dea175e272874e1f8b105865615d5172..fcfe17a19a612976ef87f099946210667601b071 100644 (file)
@@ -779,7 +779,7 @@ base_sock_create(struct net *net, struct socket *sock, int protocol)
 }
 
 static int
-mISDN_sock_create(struct net *net, struct socket *sock, int proto)
+mISDN_sock_create(struct net *net, struct socket *sock, int proto, int kern)
 {
        int err = -EPROTONOSUPPORT;
 
index c14ee24c05a87f49c48a04eb89b80860620c84ad..ac806b27c658a66f73e3614c9715a674db0d3453 100644 (file)
@@ -104,7 +104,8 @@ int pppox_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
 
 EXPORT_SYMBOL(pppox_ioctl);
 
-static int pppox_create(struct net *net, struct socket *sock, int protocol)
+static int pppox_create(struct net *net, struct socket *sock, int protocol,
+                       int kern)
 {
        int rc = -EPROTOTYPE;
 
index 4da9d571b053fdda06d50f57b58eb115bfd35d58..70ee3c310f15711bf291c42e182db2483ffcddae 100644 (file)
@@ -204,7 +204,8 @@ struct proto_ops {
 
 struct net_proto_family {
        int             family;
-       int             (*create)(struct net *net, struct socket *sock, int protocol);
+       int             (*create)(struct net *net, struct socket *sock,
+                                 int protocol, int kern);
        struct module   *owner;
 };
 
index abe38014b7fd894538e0edfa79eaf5faf8198ccb..4b0ce2e2b46ebff6037ae14fe369a57f1339adef 100644 (file)
@@ -1021,7 +1021,8 @@ static struct proto ddp_proto = {
  * Create a socket. Initialise the socket, blank the addresses
  * set the state.
  */
-static int atalk_create(struct net *net, struct socket *sock, int protocol)
+static int atalk_create(struct net *net, struct socket *sock, int protocol,
+                       int kern)
 {
        struct sock *sk;
        int rc = -ESOCKTNOSUPPORT;
index a6e1fdbae87fac418e8295cade7b7c6ebe53a2bf..8d74e62b0d79f93e63cabde5474b0d9f13d4bd04 100644 (file)
@@ -127,7 +127,8 @@ static const struct proto_ops pvc_proto_ops = {
 };
 
 
-static int pvc_create(struct net *net, struct socket *sock,int protocol)
+static int pvc_create(struct net *net, struct socket *sock, int protocol,
+                     int kern)
 {
        if (net != &init_net)
                return -EAFNOSUPPORT;
index 8193542333181fd694628ea3512208944adf3a9d..c7395070ee780715d7181cbad05f8762a01555dd 100644 (file)
@@ -25,7 +25,7 @@
 #include "signaling.h"
 #include "addr.h"
 
-static int svc_create(struct net *net, struct socket *sock,int protocol);
+static int svc_create(struct net *net, struct socket *sock, int protocol, int kern);
 
 /*
  * Note: since all this is still nicely synchronized with the signaling demon,
@@ -330,7 +330,7 @@ static int svc_accept(struct socket *sock,struct socket *newsock,int flags)
 
        lock_sock(sk);
 
-       error = svc_create(sock_net(sk), newsock,0);
+       error = svc_create(sock_net(sk), newsock, 0, 0);
        if (error)
                goto out;
 
@@ -650,7 +650,8 @@ static const struct proto_ops svc_proto_ops = {
 };
 
 
-static int svc_create(struct net *net, struct socket *sock,int protocol)
+static int svc_create(struct net *net, struct socket *sock, int protocol,
+                     int kern)
 {
        int error;
 
index f1e998b2796ec8c40fb881deff0d5953f24715ef..d6ddfa4c4471fad58183e520c7e05b1c5ec69081 100644 (file)
@@ -799,7 +799,8 @@ static struct proto ax25_proto = {
        .obj_size = sizeof(struct sock),
 };
 
-static int ax25_create(struct net *net, struct socket *sock, int protocol)
+static int ax25_create(struct net *net, struct socket *sock, int protocol,
+                      int kern)
 {
        struct sock *sk;
        ax25_cb *ax25;
index 399e59c9c6cb6de5c3bae281ceae833b5ed53894..087cc51f592733fba6557d5456801dc75a6b69a0 100644 (file)
@@ -126,7 +126,8 @@ int bt_sock_unregister(int proto)
 }
 EXPORT_SYMBOL(bt_sock_unregister);
 
-static int bt_sock_create(struct net *net, struct socket *sock, int proto)
+static int bt_sock_create(struct net *net, struct socket *sock, int proto,
+                         int kern)
 {
        int err;
 
@@ -144,7 +145,7 @@ static int bt_sock_create(struct net *net, struct socket *sock, int proto)
        read_lock(&bt_proto_lock);
 
        if (bt_proto[proto] && try_module_get(bt_proto[proto]->owner)) {
-               err = bt_proto[proto]->create(net, sock, proto);
+               err = bt_proto[proto]->create(net, sock, proto, kern);
                bt_sock_reclassify_lock(sock, proto);
                module_put(bt_proto[proto]->owner);
        }
index 0a2c5460bb48cd7f8af1c9c87ecda6a9b90cfa2a..2ff6ac7b2ed494b8ffcac277d0e067b92d408734 100644 (file)
@@ -195,7 +195,8 @@ static struct proto bnep_proto = {
        .obj_size       = sizeof(struct bt_sock)
 };
 
-static int bnep_sock_create(struct net *net, struct socket *sock, int protocol)
+static int bnep_sock_create(struct net *net, struct socket *sock, int protocol,
+                           int kern)
 {
        struct sock *sk;
 
index de7c8040bc5642bf16521010e0d006fadc506342..978cc3a718ad1726de639fd93762b5d926a1592f 100644 (file)
@@ -190,7 +190,8 @@ static struct proto cmtp_proto = {
        .obj_size       = sizeof(struct bt_sock)
 };
 
-static int cmtp_sock_create(struct net *net, struct socket *sock, int protocol)
+static int cmtp_sock_create(struct net *net, struct socket *sock, int protocol,
+                           int kern)
 {
        struct sock *sk;
 
index e7395f2319897312eb0428df974241e32bd27998..1ca5c7ca9bd44833f268c35b51670e7c05d6b327 100644 (file)
@@ -621,7 +621,8 @@ static struct proto hci_sk_proto = {
        .obj_size       = sizeof(struct hci_pinfo)
 };
 
-static int hci_sock_create(struct net *net, struct socket *sock, int protocol)
+static int hci_sock_create(struct net *net, struct socket *sock, int protocol,
+                          int kern)
 {
        struct sock *sk;
 
index 4beb6a7a2953fe3d2a997434d344297667609aa8..9cfef68b9feceaacf6165faafcc120fe99c9bfa1 100644 (file)
@@ -241,7 +241,8 @@ static struct proto hidp_proto = {
        .obj_size       = sizeof(struct bt_sock)
 };
 
-static int hidp_sock_create(struct net *net, struct socket *sock, int protocol)
+static int hidp_sock_create(struct net *net, struct socket *sock, int protocol,
+                           int kern)
 {
        struct sock *sk;
 
index d65101d92ee59d6f6f0c1ad7d153401178c5a2d1..365ae161d702b8f6174df8e5ceaf04c825d7a760 100644 (file)
@@ -819,7 +819,8 @@ static struct sock *l2cap_sock_alloc(struct net *net, struct socket *sock, int p
        return sk;
 }
 
-static int l2cap_sock_create(struct net *net, struct socket *sock, int protocol)
+static int l2cap_sock_create(struct net *net, struct socket *sock, int protocol,
+                            int kern)
 {
        struct sock *sk;
 
index d3bfc1b0afb14c65a170fea886fb2ceeaf368a35..4b5968dda6736bab575a4ac2a6200dbff400d7b3 100644 (file)
@@ -323,7 +323,8 @@ static struct sock *rfcomm_sock_alloc(struct net *net, struct socket *sock, int
        return sk;
 }
 
-static int rfcomm_sock_create(struct net *net, struct socket *sock, int protocol)
+static int rfcomm_sock_create(struct net *net, struct socket *sock,
+                             int protocol, int kern)
 {
        struct sock *sk;
 
index 694a65541b73a2ca39af4327c62840aa73723f44..dd8f6ec57dcec21cc6401c7dba5a74af67beb782 100644 (file)
@@ -430,7 +430,8 @@ static struct sock *sco_sock_alloc(struct net *net, struct socket *sock, int pro
        return sk;
 }
 
-static int sco_sock_create(struct net *net, struct socket *sock, int protocol)
+static int sco_sock_create(struct net *net, struct socket *sock, int protocol,
+                          int kern)
 {
        struct sock *sk;
 
index 9c0426dc3184cca6739a61db144ac4db9f296b90..833bd838edc69c74d9eb6cfabba12f3d2f96f8ce 100644 (file)
@@ -114,7 +114,8 @@ static void can_sock_destruct(struct sock *sk)
        skb_queue_purge(&sk->sk_receive_queue);
 }
 
-static int can_create(struct net *net, struct socket *sock, int protocol)
+static int can_create(struct net *net, struct socket *sock, int protocol,
+                     int kern)
 {
        struct sock *sk;
        struct can_proto *cp;
index 2e355841ca99bc2e03936182a4f0f8921e71ca0e..9ade3a6de954296cc72a4989d6201d6d2ae944f1 100644 (file)
@@ -675,7 +675,8 @@ char *dn_addr2asc(__u16 addr, char *buf)
 
 
 
-static int dn_create(struct net *net, struct socket *sock, int protocol)
+static int dn_create(struct net *net, struct socket *sock, int protocol,
+                    int kern)
 {
        struct sock *sk;
 
index 5e9426a11c3ed8955c2f46af8d3d3c0f14b75cf4..596679803de57626b1c4220389fb3ec1da46317a 100644 (file)
@@ -605,7 +605,8 @@ static struct proto econet_proto = {
  *     Create an Econet socket
  */
 
-static int econet_create(struct net *net, struct socket *sock, int protocol)
+static int econet_create(struct net *net, struct socket *sock, int protocol,
+                        int kern)
 {
        struct sock *sk;
        struct econet_sock *eo;
index 309348fba72b850e4049f990a75662d3501b0292..de6e34d2a7f8d6e59d51ec2938f95410916da335 100644 (file)
@@ -234,7 +234,7 @@ static const struct proto_ops ieee802154_dgram_ops = {
  * set the state.
  */
 static int ieee802154_create(struct net *net, struct socket *sock,
-               int protocol)
+                            int protocol, int kern)
 {
        struct sock *sk;
        int rc;
index 180ec4c949193f6de57b5a84b12733587a8feef1..5c7e42c02afbf187ce8be0d842bca3eda629c677 100644 (file)
@@ -262,7 +262,8 @@ static inline int inet_netns_ok(struct net *net, int protocol)
  *     Create an inet socket.
  */
 
-static int inet_create(struct net *net, struct socket *sock, int protocol)
+static int inet_create(struct net *net, struct socket *sock, int protocol,
+                      int kern)
 {
        struct sock *sk;
        struct inet_protosw *answer;
index 1b38893565993c5c6d6daedc7d12c694bf01f94f..45ed5e05ab329017d10aefbf26ba326886e5ccc1 100644 (file)
@@ -95,7 +95,8 @@ static __inline__ struct ipv6_pinfo *inet6_sk_generic(struct sock *sk)
        return (struct ipv6_pinfo *)(((u8 *)sk) + offset);
 }
 
-static int inet6_create(struct net *net, struct socket *sock, int protocol)
+static int inet6_create(struct net *net, struct socket *sock, int protocol,
+                       int kern)
 {
        struct inet_sock *inet;
        struct ipv6_pinfo *np;
index 6481ee4bdf7231db11e1dd2a51d16d27cb1a9d68..96d193a24415412896269cb6ef5938f022dc2fa2 100644 (file)
@@ -1352,7 +1352,8 @@ static struct proto ipx_proto = {
        .obj_size = sizeof(struct ipx_sock),
 };
 
-static int ipx_create(struct net *net, struct socket *sock, int protocol)
+static int ipx_create(struct net *net, struct socket *sock, int protocol,
+                     int kern)
 {
        int rc = -ESOCKTNOSUPPORT;
        struct sock *sk;
index 9429e4002bcace9b51480b69865b73f3fc334193..e73a0016c0aaa5a4ff735f4dfc9c2a00df0269a7 100644 (file)
@@ -61,7 +61,7 @@
 
 #include <net/irda/af_irda.h>
 
-static int irda_create(struct net *net, struct socket *sock, int protocol);
+static int irda_create(struct net *net, struct socket *sock, int protocol, int kern);
 
 static const struct proto_ops irda_stream_ops;
 static const struct proto_ops irda_seqpacket_ops;
@@ -839,7 +839,7 @@ static int irda_accept(struct socket *sock, struct socket *newsock, int flags)
 
        IRDA_DEBUG(2, "%s()\n", __func__);
 
-       err = irda_create(sock_net(sk), newsock, sk->sk_protocol);
+       err = irda_create(sock_net(sk), newsock, sk->sk_protocol, 0);
        if (err)
                return err;
 
@@ -1062,7 +1062,8 @@ static struct proto irda_proto = {
  *    Create IrDA socket
  *
  */
-static int irda_create(struct net *net, struct socket *sock, int protocol)
+static int irda_create(struct net *net, struct socket *sock, int protocol,
+                      int kern)
 {
        struct sock *sk;
        struct irda_sock *self;
index 3aebabb158a87d9af522600acef8bb45063d9f1f..1e428863574fe280966af5f04755f87bc1a4887f 100644 (file)
@@ -481,7 +481,8 @@ static struct sock *iucv_sock_alloc(struct socket *sock, int proto, gfp_t prio)
 }
 
 /* Create an IUCV socket */
-static int iucv_sock_create(struct net *net, struct socket *sock, int protocol)
+static int iucv_sock_create(struct net *net, struct socket *sock, int protocol,
+                           int kern)
 {
        struct sock *sk;
 
index 472f6594184ade7da3a7d37bb472e55084be30f5..86b2c22d091876cdfd3a26e3711b58a3bd0b32b0 100644 (file)
@@ -177,7 +177,8 @@ static struct proto key_proto = {
        .obj_size = sizeof(struct pfkey_sock),
 };
 
-static int pfkey_create(struct net *net, struct socket *sock, int protocol)
+static int pfkey_create(struct net *net, struct socket *sock, int protocol,
+                       int kern)
 {
        struct netns_pfkey *net_pfkey = net_generic(net, pfkey_net_id);
        struct sock *sk;
index 4866b4fb0c2785d02135e310092af9399ac18748..5266c286b260e6ee9d0a7f9d718f3b94216eaa19 100644 (file)
@@ -140,14 +140,17 @@ static struct proto llc_proto = {
 
 /**
  *     llc_ui_create - alloc and init a new llc_ui socket
+ *     @net: network namespace (must be default network)
  *     @sock: Socket to initialize and attach allocated sk to.
  *     @protocol: Unused.
+ *     @kern: on behalf of kernel or userspace
  *
  *     Allocate and initialize a new llc_ui socket, validate the user wants a
  *     socket type we have available.
  *     Returns 0 upon success, negative upon failure.
  */
-static int llc_ui_create(struct net *net, struct socket *sock, int protocol)
+static int llc_ui_create(struct net *net, struct socket *sock, int protocol,
+                        int kern)
 {
        struct sock *sk;
        int rc = -ESOCKTNOSUPPORT;
index 0cd2d88293136c271f72df7f1a4478919f448a06..aea805c98da3ee5b6312277c29c55cf92fc80ae3 100644 (file)
@@ -428,7 +428,8 @@ static int __netlink_create(struct net *net, struct socket *sock,
        return 0;
 }
 
-static int netlink_create(struct net *net, struct socket *sock, int protocol)
+static int netlink_create(struct net *net, struct socket *sock, int protocol,
+                         int kern)
 {
        struct module *module = NULL;
        struct mutex *cb_mutex;
index 281fa597cae5cafb45fed9677c819d3ccaaf8f79..4bdd5697f63b6a60a643b7c97b1690afd11f01ac 100644 (file)
@@ -425,7 +425,8 @@ static struct proto nr_proto = {
        .obj_size = sizeof(struct nr_sock),
 };
 
-static int nr_create(struct net *net, struct socket *sock, int protocol)
+static int nr_create(struct net *net, struct socket *sock, int protocol,
+                    int kern)
 {
        struct sock *sk;
        struct nr_sock *nr;
index 91d246d3478066f4b0d79c4f95aa2f00915c374f..3304caa65347a66b2b39fad947f53217e6585eb5 100644 (file)
@@ -1344,7 +1344,8 @@ static struct proto packet_proto = {
  *     Create a packet of type SOCK_PACKET.
  */
 
-static int packet_create(struct net *net, struct socket *sock, int protocol)
+static int packet_create(struct net *net, struct socket *sock, int protocol,
+                        int kern)
 {
        struct sock *sk;
        struct packet_sock *po;
index 66737aa995eae8da19a68764c466749478724968..3bd1be6b26f0258932ae14c51995fbefe1b641c0 100644 (file)
@@ -60,7 +60,8 @@ static inline void phonet_proto_put(struct phonet_protocol *pp)
 
 /* protocol family functions */
 
-static int pn_socket_create(struct net *net, struct socket *sock, int protocol)
+static int pn_socket_create(struct net *net, struct socket *sock, int protocol,
+                           int kern)
 {
        struct sock *sk;
        struct pn_sock *pn;
index 2b978dc6e75de5428b7b7f1e2f272d074ac69dc7..e25d8d5ce8df57a2c618eaed16526f441f52004d 100644 (file)
@@ -410,7 +410,8 @@ static int __rds_create(struct socket *sock, struct sock *sk, int protocol)
        return 0;
 }
 
-static int rds_create(struct net *net, struct socket *sock, int protocol)
+static int rds_create(struct net *net, struct socket *sock, int protocol,
+                     int kern)
 {
        struct sock *sk;
 
index c17734c2ce8936f488619ea7ef14b2bebe9e79cb..4de4287fec37ea20e1776f34221b4703956646ea 100644 (file)
@@ -512,7 +512,8 @@ static struct proto rose_proto = {
        .obj_size = sizeof(struct rose_sock),
 };
 
-static int rose_create(struct net *net, struct socket *sock, int protocol)
+static int rose_create(struct net *net, struct socket *sock, int protocol,
+                      int kern)
 {
        struct sock *sk;
        struct rose_sock *rose;
index 6817c9781ef35b0385268a3fc50bf213a5a24db7..f978d02a248adad9cb94bba9d1b026c9102a7957 100644 (file)
@@ -608,7 +608,8 @@ static unsigned int rxrpc_poll(struct file *file, struct socket *sock,
 /*
  * create an RxRPC socket
  */
-static int rxrpc_create(struct net *net, struct socket *sock, int protocol)
+static int rxrpc_create(struct net *net, struct socket *sock, int protocol,
+                       int kern)
 {
        struct rxrpc_sock *rx;
        struct sock *sk;
index 9dff31c9b799aad1472222e760278daeb2e1b996..4f3e0f0c156b76d393098e192a0072fa315795c8 100644 (file)
@@ -1252,7 +1252,7 @@ static int __sock_create(struct net *net, int family, int type, int protocol,
        /* Now protected by module ref count */
        rcu_read_unlock();
 
-       err = pf->create(net, sock, protocol);
+       err = pf->create(net, sock, protocol, kern);
        if (err < 0)
                goto out_module_put;
 
index e6d9abf7440e09dac80152770f6a22b83a1c8201..d00c2119faf3b2e5e17845f74e4fe5d0e6bfbfe7 100644 (file)
@@ -177,6 +177,7 @@ static void reject_rx_queue(struct sock *sk)
  * @net: network namespace (must be default network)
  * @sock: pre-allocated socket structure
  * @protocol: protocol indicator (must be 0)
+ * @kern: caused by kernel or by userspace?
  *
  * This routine creates additional data structures used by the TIPC socket,
  * initializes them, and links them together.
@@ -184,7 +185,8 @@ static void reject_rx_queue(struct sock *sk)
  * Returns 0 on success, errno otherwise
  */
 
-static int tipc_create(struct net *net, struct socket *sock, int protocol)
+static int tipc_create(struct net *net, struct socket *sock, int protocol,
+                      int kern)
 {
        const struct proto_ops *ops;
        socket_state state;
@@ -1528,7 +1530,7 @@ static int accept(struct socket *sock, struct socket *new_sock, int flags)
 
        buf = skb_peek(&sk->sk_receive_queue);
 
-       res = tipc_create(sock_net(sock->sk), new_sock, 0);
+       res = tipc_create(sock_net(sock->sk), new_sock, 0, 0);
        if (!res) {
                struct sock *new_sk = new_sock->sk;
                struct tipc_sock *new_tsock = tipc_sk(new_sk);
index 3291902f0b8821ce4dda2c34b99b6f968fd8e115..178d3af2a6054819f40f9d1212912c2df6dd5d0f 100644 (file)
@@ -621,7 +621,8 @@ out:
        return sk;
 }
 
-static int unix_create(struct net *net, struct socket *sock, int protocol)
+static int unix_create(struct net *net, struct socket *sock, int protocol,
+                      int kern)
 {
        if (protocol && protocol != PF_UNIX)
                return -EPROTONOSUPPORT;
index e19d811788a548c73e137f600ed2f7c6c258a959..38e235f61e27028c1db80c36608fef1aae069c0e 100644 (file)
@@ -501,7 +501,8 @@ out:
        return sk;
 }
 
-static int x25_create(struct net *net, struct socket *sock, int protocol)
+static int x25_create(struct net *net, struct socket *sock, int protocol,
+                     int kern)
 {
        struct sock *sk;
        struct x25_sock *x25;