return; drop_unlock: kfree_skb(skb); goto out; 
void llc_conn_handler(struct llc_sap *sap, struct sk_buff *skb){	struct llc_addr saddr, daddr;	struct sock *sk;	llc_pdu_decode_sa(skb, saddr.mac);	llc_pdu_decode_ssap(skb, &saddr.lsap);	llc_pdu_decode_da(skb, daddr.mac);	llc_pdu_decode_dsap(skb, &daddr.lsap);	sk = llc_lookup_established(sap, &saddr, &daddr);	if (!sk) {		/*		 * Didn't find an active connection; verify if there		 * is a listening socket for this llc addr		 */		struct llc_sock *llc;		struct sock *parent = llc_lookup_listener(sap, &daddr);		if (!parent) {			dprintk("llc_lookup_listener failed!\n");			goto drop;		}		sk = llc_sk_alloc(parent->sk_family, GFP_ATOMIC, parent->sk_prot);		if (!sk) {			sock_put(parent);			goto drop;		}		llc = llc_sk(sk);		memcpy(&llc->laddr, &daddr, sizeof(llc->laddr));		memcpy(&llc->daddr, &saddr, sizeof(llc->daddr));		llc_sap_add_socket(sap, sk);		sock_hold(sk);		skb_set_owner_r(skb, parent);		sock_put(parent);	}	bh_lock_sock(sk);	if (!sock_owned_by_user(sk))		llc_conn_rcv(sk, skb);	else {		dprintk("%s: adding to backlog...\n", __FUNCTION__);		llc_set_backlog_type(skb, LLC_PACKET);		sk_add_backlog(sk, skb);	}	bh_unlock_sock(sk);	sock_put(sk);	return;drop:	kfree_skb(skb);}
4520	/local/tlutelli/issta_data/temp/c/2005_temp/2005/4520/d389424e00f9097cd24b3df4ca0ab7221f140eeb/llc_conn.c/clean/net/llc/llc_conn.c