struct socket **res);
extern int sock_create_kern(int family, int type, int proto,
struct socket **res);
+extern int sock_create_lite(int family, int type, int proto,
+ struct socket **res);
extern void sock_release(struct socket *sock);
extern int sock_sendmsg(struct socket *sock, struct msghdr *msg,
size_t len);
BT_DBG("session %p", s);
- nsock = sock_alloc();
- if (!nsock)
+ if (sock_create_lite(PF_BLUETOOTH, SOCK_SEQPACKET, BTPROTO_L2CAP, &nsock))
return;
-
- nsock->type = sock->type;
+
nsock->ops = sock->ops;
__module_get(nsock->ops->owner);
if (unit<0 || unit>=MAX_LINKS)
return NULL;
- if (!(sock = sock_alloc()))
+ if (sock_create_lite(PF_NETLINK, SOCK_DGRAM, unit, &sock))
return NULL;
- sock->type = SOCK_RAW;
-
if (netlink_create(sock, unit) < 0) {
sock_release(sock);
return NULL;
* NULL is returned.
*/
-struct socket *sock_alloc(void)
+static struct socket *sock_alloc(void)
{
struct inode * inode;
struct socket * sock;
return err;
}
+int sock_create_lite(int family, int type, int protocol, struct socket **res)
+{
+ int err;
+ struct socket *sock = NULL;
+
+ err = security_socket_create(family, type, protocol, 1);
+ if (err)
+ goto out;
+
+ sock = sock_alloc();
+ if (!sock) {
+ err = -ENOMEM;
+ goto out;
+ }
+
+ security_socket_post_create(sock, family, type, protocol, 1);
+ sock->type = type;
+out:
+ *res = sock;
+ return err;
+}
/* No kernel lock held - perfect */
static unsigned int sock_poll(struct file *file, poll_table * wait)
EXPORT_SYMBOL(sock_alloc_inode);
EXPORT_SYMBOL(sock_create);
EXPORT_SYMBOL(sock_create_kern);
+EXPORT_SYMBOL(sock_create_lite);
EXPORT_SYMBOL(sock_map_fd);
EXPORT_SYMBOL(sock_recvmsg);
EXPORT_SYMBOL(sock_register);
if (!sock)
return;
- if (!(newsock = sock_alloc())) {
- printk(KERN_WARNING "%s: no more sockets!\n", serv->sv_name);
+ err = sock_create_lite(PF_INET, SOCK_STREAM, IPPROTO_TCP, &newsock);
+ if (err) {
+ if (err == -ENOMEM)
+ printk(KERN_WARNING "%s: no more sockets!\n",
+ serv->sv_name);
return;
}
- dprintk("svc: tcp_accept %p allocated\n", newsock);
- newsock->type = sock->type;
+ dprintk("svc: tcp_accept %p allocated\n", newsock);
newsock->ops = ops = sock->ops;
clear_bit(SK_CONN, &svsk->sk_flags);