diff options
Diffstat (limited to 'net/llc/llc_input.c')
-rw-r--r-- | net/llc/llc_input.c | 19 |
1 files changed, 14 insertions, 5 deletions
diff --git a/net/llc/llc_input.c b/net/llc/llc_input.c index 13b46240b7a1..8f3addf0724c 100644 --- a/net/llc/llc_input.c +++ b/net/llc/llc_input.c | |||
@@ -99,15 +99,19 @@ out: | |||
99 | static inline int llc_fixup_skb(struct sk_buff *skb) | 99 | static inline int llc_fixup_skb(struct sk_buff *skb) |
100 | { | 100 | { |
101 | u8 llc_len = 2; | 101 | u8 llc_len = 2; |
102 | struct llc_pdu_sn *pdu; | 102 | struct llc_pdu_un *pdu; |
103 | 103 | ||
104 | if (!pskb_may_pull(skb, sizeof(*pdu))) | 104 | if (unlikely(!pskb_may_pull(skb, sizeof(*pdu)))) |
105 | return 0; | 105 | return 0; |
106 | 106 | ||
107 | pdu = (struct llc_pdu_sn *)skb->data; | 107 | pdu = (struct llc_pdu_un *)skb->data; |
108 | if ((pdu->ctrl_1 & LLC_PDU_TYPE_MASK) == LLC_PDU_TYPE_U) | 108 | if ((pdu->ctrl_1 & LLC_PDU_TYPE_MASK) == LLC_PDU_TYPE_U) |
109 | llc_len = 1; | 109 | llc_len = 1; |
110 | llc_len += 2; | 110 | llc_len += 2; |
111 | |||
112 | if (unlikely(!pskb_may_pull(skb, llc_len))) | ||
113 | return 0; | ||
114 | |||
111 | skb->h.raw += llc_len; | 115 | skb->h.raw += llc_len; |
112 | skb_pull(skb, llc_len); | 116 | skb_pull(skb, llc_len); |
113 | if (skb->protocol == htons(ETH_P_802_2)) { | 117 | if (skb->protocol == htons(ETH_P_802_2)) { |
@@ -166,17 +170,22 @@ int llc_rcv(struct sk_buff *skb, struct net_device *dev, | |||
166 | */ | 170 | */ |
167 | if (sap->rcv_func) { | 171 | if (sap->rcv_func) { |
168 | sap->rcv_func(skb, dev, pt, orig_dev); | 172 | sap->rcv_func(skb, dev, pt, orig_dev); |
169 | goto out; | 173 | goto out_put; |
170 | } | 174 | } |
171 | dest = llc_pdu_type(skb); | 175 | dest = llc_pdu_type(skb); |
172 | if (unlikely(!dest || !llc_type_handlers[dest - 1])) | 176 | if (unlikely(!dest || !llc_type_handlers[dest - 1])) |
173 | goto drop; | 177 | goto drop_put; |
174 | llc_type_handlers[dest - 1](sap, skb); | 178 | llc_type_handlers[dest - 1](sap, skb); |
179 | out_put: | ||
180 | llc_sap_put(sap); | ||
175 | out: | 181 | out: |
176 | return 0; | 182 | return 0; |
177 | drop: | 183 | drop: |
178 | kfree_skb(skb); | 184 | kfree_skb(skb); |
179 | goto out; | 185 | goto out; |
186 | drop_put: | ||
187 | kfree_skb(skb); | ||
188 | goto out_put; | ||
180 | handle_station: | 189 | handle_station: |
181 | if (!llc_station_handler) | 190 | if (!llc_station_handler) |
182 | goto drop; | 191 | goto drop; |