* or we break the sematics of SIOCATMARK (and thus sockatmark()) 
* or we break the semantics of SIOCATMARK (and thus sockatmark()) 
static void tcp_check_urg(struct sock * sk, struct tcphdr * th){	struct tcp_sock *tp = tcp_sk(sk);	u32 ptr = ntohs(th->urg_ptr);	if (ptr && !sysctl_tcp_stdurg)		ptr--;	ptr += ntohl(th->seq);	/* Ignore urgent data that we've already seen and read. */	if (after(tp->copied_seq, ptr))		return;	/* Do not replay urg ptr.	 *	 * NOTE: interesting situation not covered by specs.	 * Misbehaving sender may send urg ptr, pointing to segment,	 * which we already have in ofo queue. We are not able to fetch	 * such data and will stay in TCP_URG_NOTYET until will be eaten	 * by recvmsg(). Seems, we are not obliged to handle such wicked	 * situations. But it is worth to think about possibility of some	 * DoSes using some hypothetical application level deadlock.	 */	if (before(ptr, tp->rcv_nxt))		return;	/* Do we already have a newer (or duplicate) urgent pointer? */	if (tp->urg_data && !after(ptr, tp->urg_seq))		return;	/* Tell the world about our new urgent pointer. */	sk_send_sigurg(sk);	/* We may be adding urgent data when the last byte read was	 * urgent. To do this requires some care. We cannot just ignore	 * tp->copied_seq since we would read the last urgent byte again	 * as data, nor can we alter copied_seq until this data arrives	 * or we break the sematics of SIOCATMARK (and thus sockatmark())	 *	 * NOTE. Double Dutch. Rendering to plain English: author of comment	 * above did something sort of 	send("A", MSG_OOB); send("B", MSG_OOB);	 * and expect that both A and B disappear from stream. This is _wrong_.	 * Though this happens in BSD with high probability, this is occasional.	 * Any application relying on this is buggy. Note also, that fix "works"	 * only in this artificial test. Insert some normal data between A and B and we will	 * decline of BSD again. Verdict: it is better to remove to trap	 * buggy users.	 */	if (tp->urg_seq == tp->copied_seq && tp->urg_data &&	    !sock_flag(sk, SOCK_URGINLINE) &&	    tp->copied_seq != tp->rcv_nxt) {		struct sk_buff *skb = skb_peek(&sk->sk_receive_queue);		tp->copied_seq++;		if (skb && !before(tp->copied_seq, TCP_SKB_CB(skb)->end_seq)) {			__skb_unlink(skb, &sk->sk_receive_queue);			__kfree_skb(skb);		}	}	tp->urg_data   = TCP_URG_NOTYET;	tp->urg_seq    = ptr;	/* Disable header prediction. */	tp->pred_flags = 0;}
10457	/local/tlutelli/issta_data/temp/c/2005_temp/2005/10457/caa20d9abe810be2ede9612b6c9db6ce7d6edf80/tcp_input.c/buggy/net/ipv4/tcp_input.c