X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=net%2Fipv4%2Fraw.c;fp=net%2Fipv4%2Fraw.c;h=655aeba924d2f4c71d638af03fae01bfe067b159;hb=9213980e6a70d8473e0ffd4b39ab5b6caaba9ff5;hp=a0650881af72fd4b68eaaea26ff212ef77ef0be6;hpb=c449269f45c2cdf53af08c8d0af37472f66539d9;p=linux-2.6.git diff --git a/net/ipv4/raw.c b/net/ipv4/raw.c index a0650881a..655aeba92 100644 --- a/net/ipv4/raw.c +++ b/net/ipv4/raw.c @@ -352,7 +352,7 @@ error_fault: err = -EFAULT; kfree_skb(skb); error: - IP_INC_STATS(IpOutDiscards); + IP_INC_STATS(OutDiscards); return err; } @@ -462,6 +462,13 @@ static int raw_sendmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg, .proto = inet->hdrincl ? IPPROTO_RAW : sk->sk_protocol, }; + + if (sk->sk_nx_info) { + err = ip_find_src(sk->sk_nx_info, &rt, &fl); + + if (err) + goto done; + } err = ip_route_output_flow(&rt, &fl, sk, !(msg->msg_flags&MSG_DONTWAIT)); } if (err) @@ -601,7 +608,7 @@ static int raw_init(struct sock *sk) return 0; } -static int raw_seticmpfilter(struct sock *sk, char *optval, int optlen) +static int raw_seticmpfilter(struct sock *sk, char __user *optval, int optlen) { if (optlen > sizeof(struct icmp_filter)) optlen = sizeof(struct icmp_filter); @@ -610,7 +617,7 @@ static int raw_seticmpfilter(struct sock *sk, char *optval, int optlen) return 0; } -static int raw_geticmpfilter(struct sock *sk, char *optval, int *optlen) +static int raw_geticmpfilter(struct sock *sk, char __user *optval, int __user *optlen) { int len, ret = -EFAULT; @@ -630,7 +637,7 @@ out: return ret; } static int raw_setsockopt(struct sock *sk, int level, int optname, - char *optval, int optlen) + char __user *optval, int optlen) { if (level != SOL_RAW) return ip_setsockopt(sk, level, optname, optval, optlen); @@ -645,7 +652,7 @@ static int raw_setsockopt(struct sock *sk, int level, int optname, } static int raw_getsockopt(struct sock *sk, int level, int optname, - char *optval, int *optlen) + char __user *optval, int __user *optlen) { if (level != SOL_RAW) return ip_getsockopt(sk, level, optname, optval, optlen); @@ -664,7 +671,7 @@ static int raw_ioctl(struct sock *sk, int cmd, unsigned long arg) switch (cmd) { case SIOCOUTQ: { int amount = atomic_read(&sk->sk_wmem_alloc); - return put_user(amount, (int *)arg); + return put_user(amount, (int __user *)arg); } case SIOCINQ: { struct sk_buff *skb; @@ -675,12 +682,12 @@ static int raw_ioctl(struct sock *sk, int cmd, unsigned long arg) if (skb != NULL) amount = skb->len; spin_unlock_irq(&sk->sk_receive_queue.lock); - return put_user(amount, (int *)arg); + return put_user(amount, (int __user *)arg); } default: #ifdef CONFIG_IP_MROUTE - return ipmr_ioctl(sk, cmd, arg); + return ipmr_ioctl(sk, cmd, (void __user *)arg); #else return -ENOIOCTLCMD; #endif