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 linux-cve-announce PHC | |
Open Source and information security mailing list archives
| ||
|
Date: Thu, 1 Dec 2011 22:18:11 -0800 From: Vijay Subramanian <subramanian.vijay@...il.com> To: Eric Dumazet <eric.dumazet@...il.com> Cc: Tom Herbert <therbert@...gle.com>, Linux Netdev List <netdev@...r.kernel.org>, David Miller <davem@...emloft.net> Subject: Re: Bug in computing data_len in tcp_sendmsg? >> I am looking at tcp_mtu_probe() and was wondering if this commit also >> impacts this function. Once the data are copied from skbs in the write >> queue to the probe skb, copied data are cleared from the original skbs >> in the write queue. >> >> It looks like the code assumes that the original skb will have data >> either in linear part or in paged part. The call to >> __pskb_trim_head(skb, copy) for example does not clear linear part. >> >> Can someone more familiar with the code take a look? Apologies if I >> have read this wrong. >> > > tcp_mtu_probe() builds a linear skb, and populate it using > skb_copy_bits() [ this is frag aware, and aware of payload in header as > well ] > > I see no problem in it. > Eric, I think you may have misunderstood me (I think my post was not very clear). Let me try again. The MTU probe is built correctly as a linear skb. As you point out, skb_copy_bits() is frag aware and copies data from both the header and pages. The issue is with the way the data is cleared from the write queue later in the function tcp_mtu_probe(). For example, if the MTU probe size was N bytes, then the probe is inserted at the front of the write_queue and N bytes are copied from the original write-queue skbs. As these N bytes are copied, if an skb is completely consumed, it is unlinked from the write_queue and freed. If an skb is only partially consumed, then the pointers are adjusted accordingly to erase the data. For a paged skb, fully consumed pages are unreferenced. This is done as follows in tcp_mtu_probe() if (!skb_shinfo(skb)->nr_frags) { skb_pull(skb, copy); if (skb->ip_summed != CHECKSUM_PARTIAL) skb->csum = csum_partial(skb->data, skb->len, 0); } else { __pskb_trim_head(skb, copy); tcp_set_skb_tso_segs(sk, skb, mss_now); } It appears that the code assumes the data will either be in the linear part (the if condition) or in the paged part (else condition) but not both. Is this a correct assumption after the recent commit f07d960df33c5aef (tcp: avoid frag allocation for small frames)? Since __pskb_trim_head() only only removes data from the non-linear part, the data in the linear part is never removed. Maybe for paged skbs, we need something like headlen = skb_headlen(skb); skb_pull(skb, headlen); __pskb_trim_head(skb, copy - headlen); Thanks for your patience and hope this makes more sense than my previous post. Regards, Vijay Subramanian -- 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