Re: [PATCH][SELINUX] 2/2 sock_create_lite()

From: James Morris
Date: Fri May 07 2004 - 15:39:07 EST


On Fri, 7 May 2004, James Morris wrote:

> On Fri, 7 May 2004, Christoph Hellwig wrote:
>
> > On Fri, May 07, 2004 at 11:06:04AM -0400, James Morris wrote:
> > > This patch adds a function sock_create_lite(), deprecating kernel-wide use
> > > of sock_alloc(), which has been made static to net/socket.c.
> >
> > We're in the stable series and removing exported APIs there shoudn't happen.
> > Given that sock_alloc() is actually okay for every normal use I don't think
> > there's enough reason to remove it from the API.
>


Ok, here's a version of this patch which doesn't do anything with
sock_alloc().


diff -urN -X dontdiff linux-2.6.6-rc3-mm2.p/include/linux/net.h linux-2.6.6-rc3-mm2.w/include/linux/net.h
--- linux-2.6.6-rc3-mm2.p/include/linux/net.h 2004-05-06 16:59:28.000000000 -0400
+++ linux-2.6.6-rc3-mm2.w/include/linux/net.h 2004-05-07 13:57:47.669957104 -0400
@@ -151,6 +151,8 @@
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);
diff -urN -X dontdiff linux-2.6.6-rc3-mm2.p/net/bluetooth/rfcomm/core.c linux-2.6.6-rc3-mm2.w/net/bluetooth/rfcomm/core.c
--- linux-2.6.6-rc3-mm2.p/net/bluetooth/rfcomm/core.c 2004-05-06 16:59:28.000000000 -0400
+++ linux-2.6.6-rc3-mm2.w/net/bluetooth/rfcomm/core.c 2004-05-07 13:56:02.770904184 -0400
@@ -1642,11 +1642,9 @@

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);
diff -urN -X dontdiff linux-2.6.6-rc3-mm2.p/net/netlink/af_netlink.c linux-2.6.6-rc3-mm2.w/net/netlink/af_netlink.c
--- linux-2.6.6-rc3-mm2.p/net/netlink/af_netlink.c 2004-05-05 11:16:20.000000000 -0400
+++ linux-2.6.6-rc3-mm2.w/net/netlink/af_netlink.c 2004-05-07 13:56:02.771904032 -0400
@@ -833,11 +833,9 @@
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;
diff -urN -X dontdiff linux-2.6.6-rc3-mm2.p/net/sctp/protocol.c linux-2.6.6-rc3-mm2.w/net/sctp/protocol.c
--- linux-2.6.6-rc3-mm2.p/net/sctp/protocol.c 2004-04-29 10:03:53.000000000 -0400
+++ linux-2.6.6-rc3-mm2.w/net/sctp/protocol.c 2004-05-06 17:26:12.000000000 -0400
@@ -653,8 +653,8 @@
else
family = PF_INET;

- err = sock_create(family, SOCK_SEQPACKET, IPPROTO_SCTP,
- &sctp_ctl_socket);
+ err = sock_create_kern(family, SOCK_SEQPACKET, IPPROTO_SCTP,
+ &sctp_ctl_socket);
if (err < 0) {
printk(KERN_ERR
"SCTP: Failed to create the SCTP control socket.\n");
diff -urN -X dontdiff linux-2.6.6-rc3-mm2.p/net/socket.c linux-2.6.6-rc3-mm2.w/net/socket.c
--- linux-2.6.6-rc3-mm2.p/net/socket.c 2004-05-06 16:59:28.000000000 -0400
+++ linux-2.6.6-rc3-mm2.w/net/socket.c 2004-05-07 13:57:40.429057888 -0400
@@ -457,7 +457,7 @@
* NULL is returned.
*/

-struct socket *sock_alloc(void)
+static struct socket *sock_alloc(void)
{
struct inode * inode;
struct socket * sock;
@@ -840,6 +840,27 @@
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)
@@ -2001,6 +2022,7 @@
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);
diff -urN -X dontdiff linux-2.6.6-rc3-mm2.p/net/sunrpc/svcsock.c linux-2.6.6-rc3-mm2.w/net/sunrpc/svcsock.c
--- linux-2.6.6-rc3-mm2.p/net/sunrpc/svcsock.c 2004-05-06 16:59:28.000000000 -0400
+++ linux-2.6.6-rc3-mm2.w/net/sunrpc/svcsock.c 2004-05-07 13:56:02.775903424 -0400
@@ -781,13 +781,15 @@
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);

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/