ipv6: fix an oops when force unload ipv6 module
[safe/jmp/linux-2.6] / net / ipv4 / ip_output.c
index 2470262..e34013a 100644 (file)
@@ -264,9 +264,11 @@ int ip_mc_output(struct sk_buff *skb)
 
                   This check is duplicated in ip_mr_input at the moment.
                 */
-                   && ((rt->rt_flags&RTCF_LOCAL) || !(IPCB(skb)->flags&IPSKB_FORWARDED))
+                   &&
+                   ((rt->rt_flags & RTCF_LOCAL) ||
+                    !(IPCB(skb)->flags & IPSKB_FORWARDED))
 #endif
-               ) {
+                  ) {
                        struct sk_buff *newskb = skb_clone(skb, GFP_ATOMIC);
                        if (newskb)
                                NF_HOOK(PF_INET, NF_INET_POST_ROUTING, newskb,
@@ -329,21 +331,22 @@ int ip_queue_xmit(struct sk_buff *skb, int ipfragok)
                __be32 daddr;
 
                /* Use correct destination address if we have options. */
-               daddr = inet->daddr;
+               daddr = inet->inet_daddr;
                if(opt && opt->srr)
                        daddr = opt->faddr;
 
                {
                        struct flowi fl = { .oif = sk->sk_bound_dev_if,
+                                           .mark = sk->sk_mark,
                                            .nl_u = { .ip4_u =
                                                      { .daddr = daddr,
-                                                       .saddr = inet->saddr,
+                                                       .saddr = inet->inet_saddr,
                                                        .tos = RT_CONN_FLAGS(sk) } },
                                            .proto = sk->sk_protocol,
                                            .flags = inet_sk_flowi_flags(sk),
                                            .uli_u = { .ports =
-                                                      { .sport = inet->sport,
-                                                        .dport = inet->dport } } };
+                                                      { .sport = inet->inet_sport,
+                                                        .dport = inet->inet_dport } } };
 
                        /* If this fails, retransmit mechanism of transport layer will
                         * keep trying until route appears or the connection times
@@ -378,7 +381,7 @@ packet_routed:
 
        if (opt && opt->optlen) {
                iph->ihl += opt->optlen >> 2;
-               ip_options_build(skb, opt, inet->daddr, rt, 0);
+               ip_options_build(skb, opt, inet->inet_daddr, rt, 0);
        }
 
        ip_select_ident_more(iph, &rt->u.dst, sk,
@@ -500,8 +503,8 @@ int ip_fragment(struct sk_buff *skb, int (*output)(struct sk_buff *))
                        if (skb->sk) {
                                frag->sk = skb->sk;
                                frag->destructor = sock_wfree;
-                               truesizes += frag->truesize;
                        }
+                       truesizes += frag->truesize;
                }
 
                /* Everything is OK. Generate! */
@@ -813,6 +816,8 @@ int ip_append_data(struct sock *sk,
                        inet->cork.addr = ipc->addr;
                }
                rt = *rtp;
+               if (unlikely(!rt))
+                       return -EFAULT;
                /*
                 * We steal reference to this route, caller should not release it
                 */
@@ -843,7 +848,8 @@ int ip_append_data(struct sock *sk,
        maxfraglen = ((mtu - fragheaderlen) & ~7) + fragheaderlen;
 
        if (inet->cork.length + length > 0xFFFF - fragheaderlen) {
-               ip_local_error(sk, EMSGSIZE, rt->rt_dst, inet->dport, mtu-exthdrlen);
+               ip_local_error(sk, EMSGSIZE, rt->rt_dst, inet->inet_dport,
+                              mtu-exthdrlen);
                return -EMSGSIZE;
        }
 
@@ -1097,7 +1103,7 @@ ssize_t   ip_append_page(struct sock *sk, struct page *page,
        maxfraglen = ((mtu - fragheaderlen) & ~7) + fragheaderlen;
 
        if (inet->cork.length + size > 0xFFFF - fragheaderlen) {
-               ip_local_error(sk, EMSGSIZE, rt->rt_dst, inet->dport, mtu);
+               ip_local_error(sk, EMSGSIZE, rt->rt_dst, inet->inet_dport, mtu);
                return -EMSGSIZE;
        }
 
@@ -1243,7 +1249,6 @@ int ip_push_pending_frames(struct sock *sk)
                skb->len += tmp_skb->len;
                skb->data_len += tmp_skb->len;
                skb->truesize += tmp_skb->truesize;
-               __sock_put(tmp_skb->sk);
                tmp_skb->destructor = NULL;
                tmp_skb->sk = NULL;
        }
@@ -1303,7 +1308,7 @@ int ip_push_pending_frames(struct sock *sk)
        err = ip_local_out(skb);
        if (err) {
                if (err > 0)
-                       err = inet->recverr ? net_xmit_errno(err) : 0;
+                       err = net_xmit_errno(err);
                if (err)
                        goto error;
        }