lists.openwall.net | lists / announce owl-users owl-dev john-users john-dev passwdqc-users yescrypt popa3d-users / oss-security kernel-hardening musl sabotage tlsify passwords / crypt-dev xvendor / Bugtraq Full-Disclosure linux-kernel linux-netdev linux-ext4 linux-hardening PHC | |
Open Source and information security mailing list archives
| ||
|
Date: Mon, 17 Nov 2014 12:22:54 +0200 From: Denys Fedoryshchenko <nuclearcat@...learcat.com> To: Eric Dumazet <eric.dumazet@...il.com> Cc: Neal Cardwell <ncardwell@...gle.com>, Yuchung Cheng <ycheng@...gle.com>, netdev@...r.kernel.org Subject: Re: /proc/net/sockstat invalid memory accounting or memory leak in latest kernels? (trying to debug) On 2014-11-17 07:01, Eric Dumazet wrote: > On Sun, 2014-11-16 at 12:16 -0800, Eric Dumazet wrote: > >> Thanks Denys ! >> >> Could you try following patch ? >> >> Thanks ! > > Hmm.... I have an updated patch, sorry. > > (A memcpy_fromiovec() has to be memcpy_fromiovecend() ) > > diff --git a/net/ipv4/tcp_output.c b/net/ipv4/tcp_output.c > index a3d453b94747..c2bbfcd9c0db 100644 > --- a/net/ipv4/tcp_output.c > +++ b/net/ipv4/tcp_output.c > @@ -2998,7 +2998,7 @@ static int tcp_send_syn_data(struct sock *sk, > struct sk_buff *syn) > { > struct tcp_sock *tp = tcp_sk(sk); > struct tcp_fastopen_request *fo = tp->fastopen_req; > - int syn_loss = 0, space, i, err = 0, iovlen = fo->data->msg_iovlen; > + int syn_loss = 0, space, err = 0; > struct sk_buff *syn_data = NULL, *data; > unsigned long last_syn_loss = 0; > > @@ -3031,25 +3031,19 @@ static int tcp_send_syn_data(struct sock *sk, > struct sk_buff *syn) > /* limit to order-0 allocations */ > space = min_t(size_t, space, SKB_MAX_HEAD(MAX_TCP_HEADER)); > > - syn_data = skb_copy_expand(syn, MAX_TCP_HEADER, space, > - sk->sk_allocation); > - if (syn_data == NULL) > + syn_data = sk_stream_alloc_skb(sk, space, sk->sk_allocation); > + if (!syn_data) > goto fallback; > > - for (i = 0; i < iovlen && syn_data->len < space; ++i) { > - struct iovec *iov = &fo->data->msg_iov[i]; > - unsigned char __user *from = iov->iov_base; > - int len = iov->iov_len; > - > - if (syn_data->len + len > space) > - len = space - syn_data->len; > - else if (i + 1 == iovlen) > - /* No more data pending in inet_wait_for_connect() */ > - fo->data = NULL; > + syn_data->ip_summed = CHECKSUM_PARTIAL; > + memcpy(syn_data->cb, syn->cb, sizeof(syn->cb)); > + if (memcpy_fromiovecend(skb_put(syn_data, space), > + fo->data->msg_iov, 0, space)) > + goto fallback; > > - if (skb_add_data(syn_data, from, len)) > - goto fallback; > - } > + /* No more data pending in inet_wait_for_connect() */ > + if (space == fo->size) > + fo->data = NULL; > > /* Queue a data-only packet after the regular SYN for retransmission > */ > data = pskb_copy(syn_data, sk->sk_allocation); > @@ -3101,13 +3095,10 @@ int tcp_connect(struct sock *sk) > return 0; > } > > - buff = alloc_skb_fclone(MAX_TCP_HEADER + 15, sk->sk_allocation); > - if (unlikely(buff == NULL)) > + buff = sk_stream_alloc_skb(sk, 0, sk->sk_allocation); > + if (unlikely(!buff)) > return -ENOBUFS; > > - /* Reserve space for headers. */ > - skb_reserve(buff, MAX_TCP_HEADER); > - > tcp_init_nondata_skb(buff, tp->write_seq++, TCPHDR_SYN); > tp->retrans_stamp = tcp_time_stamp; > tcp_connect_queue_skb(sk, buff); Installed patch, but will have to wait a while (usually at least 24hours), to be sure if it is stable. Thanks a lot! -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@...r.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Powered by blists - more mailing lists