diff options
author | Ralf Baechle <ralf@linux-mips.org> | 1999-06-13 16:29:25 +0000 |
---|---|---|
committer | Ralf Baechle <ralf@linux-mips.org> | 1999-06-13 16:29:25 +0000 |
commit | db7d4daea91e105e3859cf461d7e53b9b77454b2 (patch) | |
tree | 9bb65b95440af09e8aca63abe56970dd3360cc57 /net/socket.c | |
parent | 9c1c01ead627bdda9211c9abd5b758d6c687d8ac (diff) |
Merge with Linux 2.2.8.
Diffstat (limited to 'net/socket.c')
-rw-r--r-- | net/socket.c | 56 |
1 files changed, 18 insertions, 38 deletions
diff --git a/net/socket.c b/net/socket.c index a6d741e82..181effb79 100644 --- a/net/socket.c +++ b/net/socket.c @@ -41,6 +41,7 @@ * Kevin Buhr : Fixed the dumb errors in the above. * Andi Kleen : Some small cleanups, optimizations, * and fixed a copy_from_user() bug. + * Tigran Aivazian : sys_send(args) calls sys_sendto(args, NULL, 0) * * * This program is free software; you can redistribute it and/or @@ -278,8 +279,8 @@ struct socket *sock_alloc(void) inode->i_mode = S_IFSOCK|S_IRWXUGO; inode->i_sock = 1; - inode->i_uid = current->uid; - inode->i_gid = current->gid; + inode->i_uid = current->fsuid; + inode->i_gid = current->fsgid; sock->inode = inode; init_waitqueue(&sock->wait); @@ -929,40 +930,6 @@ asmlinkage int sys_getpeername(int fd, struct sockaddr *usockaddr, int *usockadd } /* - * Send a datagram down a socket. The datagram as with write() is - * in user space. We check it can be read. - */ - -asmlinkage int sys_send(int fd, void * buff, size_t len, unsigned flags) -{ - struct socket *sock; - int err; - struct msghdr msg; - struct iovec iov; - - lock_kernel(); - sock = sockfd_lookup(fd, &err); - if (sock) { - iov.iov_base=buff; - iov.iov_len=len; - msg.msg_name=NULL; - msg.msg_namelen=0; - msg.msg_iov=&iov; - msg.msg_iovlen=1; - msg.msg_control=NULL; - msg.msg_controllen=0; - if (sock->file->f_flags & O_NONBLOCK) - flags |= MSG_DONTWAIT; - msg.msg_flags = flags; - err = sock_sendmsg(sock, &msg, len); - - sockfd_put(sock); - } - unlock_kernel(); - return err; -} - -/* * Send a datagram to a given address. We move the address into kernel * space and check the user space data area is readable before invoking * the protocol. @@ -1008,6 +975,14 @@ out: return err; } +/* + * Send a datagram down a socket. + */ + +asmlinkage int sys_send(int fd, void * buff, size_t len, unsigned flags) +{ + return sys_sendto(fd, buff, len, flags, NULL, 0); +} /* * Receive a frame from the socket and optionally record the address of the @@ -1059,7 +1034,7 @@ out: asmlinkage int sys_recv(int fd, void * ubuf, size_t size, unsigned flags) { - return sys_recvfrom(fd,ubuf,size,flags, NULL, NULL); + return sys_recvfrom(fd, ubuf, size, flags, NULL, NULL); } /* @@ -1160,7 +1135,7 @@ asmlinkage int sys_sendmsg(int fd, struct msghdr *msg, unsigned flags) /* Check whether to allocate the iovec area*/ err = -ENOMEM; iov_size = msg_sys.msg_iovlen * sizeof(struct iovec); - if (msg_sys.msg_iovlen > 1 /* UIO_FASTIOV */) { + if (msg_sys.msg_iovlen > UIO_FASTIOV) { iov = sock_kmalloc(sock->sk, iov_size, GFP_KERNEL); if (!iov) goto out_put; @@ -1172,6 +1147,11 @@ asmlinkage int sys_sendmsg(int fd, struct msghdr *msg, unsigned flags) goto out_freeiov; total_len = err; + err = -ENOBUFS; + + /* msg_controllen must fit to int */ + if (msg_sys.msg_controllen > INT_MAX) + goto out_freeiov; ctl_len = msg_sys.msg_controllen; if (ctl_len) { |