patch-2.4.4 linux/net/core/sock.c
Next file: linux/net/decnet/af_decnet.c
Previous file: linux/net/core/skbuff.c
Back to the patch index
Back to the overall index
- Lines: 114
- Date:
Wed Apr 25 14:57:39 2001
- Orig file:
v2.4.3/linux/net/core/sock.c
- Orig date:
Sat Feb 3 11:26:44 2001
diff -u --recursive --new-file v2.4.3/linux/net/core/sock.c linux/net/core/sock.c
@@ -7,7 +7,7 @@
* handler for protocols to use and generic option handler.
*
*
- * Version: $Id: sock.c,v 1.104 2001/01/30 07:48:30 davem Exp $
+ * Version: $Id: sock.c,v 1.110 2001/04/20 20:46:19 davem Exp $
*
* Authors: Ross Biro, <bir7@leland.Stanford.Edu>
* Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG>
@@ -79,6 +79,7 @@
* Jay Schulist : Added SO_ATTACH_FILTER and SO_DETACH_FILTER.
* Andi Kleen : Add sock_kmalloc()/sock_kfree_s()
* Andi Kleen : Fix write_space callback
+ * Chris Evans : Security fixes - signedness again
*
* To Fix:
*
@@ -425,11 +426,13 @@
struct timeval tm;
} v;
- int lv=sizeof(int),len;
+ unsigned int lv=sizeof(int),len;
if(get_user(len,optlen))
return -EFAULT;
-
+ if(len < 0)
+ return -EINVAL;
+
switch(optname)
{
case SO_DEBUG:
@@ -644,7 +647,8 @@
/* In case it might be waiting for more memory. */
atomic_sub(skb->truesize, &sk->wmem_alloc);
- sk->write_space(sk);
+ if (!sk->use_write_queue)
+ sk->write_space(sk);
sock_put(sk);
}
@@ -727,6 +731,8 @@
clear_bit(SOCK_ASYNC_NOSPACE, &sk->socket->flags);
add_wait_queue(sk->sleep, &wait);
for (;;) {
+ if (!timeo)
+ break;
if (signal_pending(current))
break;
set_bit(SOCK_NOSPACE, &sk->socket->flags);
@@ -750,7 +756,7 @@
*/
struct sk_buff *sock_alloc_send_skb(struct sock *sk, unsigned long size,
- unsigned long fallback, int noblock, int *errcode)
+ int noblock, int *errcode)
{
int err;
struct sk_buff *skb;
@@ -780,15 +786,6 @@
goto failure;
if (atomic_read(&sk->wmem_alloc) < sk->sndbuf) {
- if (fallback) {
- /* The buffer get won't block, or use the atomic queue.
- * It does produce annoying no free page messages still.
- */
- skb = alloc_skb(size, GFP_BUFFER);
- if (skb)
- break;
- try_size = fallback;
- }
skb = alloc_skb(try_size, sk->allocation);
if (skb)
break;
@@ -1064,6 +1061,36 @@
{
/* Mirror missing mmap method error code */
return -ENODEV;
+}
+
+ssize_t sock_no_sendpage(struct socket *sock, struct page *page, int offset, size_t size, int flags)
+{
+ ssize_t res;
+ struct msghdr msg;
+ struct iovec iov;
+ mm_segment_t old_fs;
+ char *kaddr;
+
+ kaddr = kmap(page);
+
+ msg.msg_name = NULL;
+ msg.msg_namelen = 0;
+ msg.msg_iov = &iov;
+ msg.msg_iovlen = 1;
+ msg.msg_control = NULL;
+ msg.msg_controllen = 0;
+ msg.msg_flags = flags;
+
+ iov.iov_base = kaddr + offset;
+ iov.iov_len = size;
+
+ old_fs = get_fs();
+ set_fs(KERNEL_DS);
+ res = sock_sendmsg(sock, &msg, size);
+ set_fs(old_fs);
+
+ kunmap(page);
+ return res;
}
/*
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)