summaryrefslogtreecommitdiffstats
path: root/net/llc/llc_if.c
diff options
context:
space:
mode:
authorEric Biggers <ebiggers@google.com>2019-10-06 23:24:26 +0200
committerJakub Kicinski <jakub.kicinski@netronome.com>2019-10-08 22:23:05 +0200
commitfc8d5db10cbe1338a52ebc74e7feab9276721774 (patch)
treee86c4bac21ea8bd46b6bcc73db671e8fcfed9681 /net/llc/llc_if.c
parentllc: fix sk_buff leak in llc_conn_service() (diff)
downloadlinux-fc8d5db10cbe1338a52ebc74e7feab9276721774.tar.xz
linux-fc8d5db10cbe1338a52ebc74e7feab9276721774.zip
llc: fix another potential sk_buff leak in llc_ui_sendmsg()
All callers of llc_conn_state_process() except llc_build_and_send_pkt() (via llc_ui_sendmsg() -> llc_ui_send_data()) assume that it always consumes a reference to the skb. Fix this caller to do the same. Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2") Signed-off-by: Eric Biggers <ebiggers@google.com> Signed-off-by: Jakub Kicinski <jakub.kicinski@netronome.com>
Diffstat (limited to 'net/llc/llc_if.c')
-rw-r--r--net/llc/llc_if.c12
1 files changed, 8 insertions, 4 deletions
diff --git a/net/llc/llc_if.c b/net/llc/llc_if.c
index 8db03c2d5440..ad6547736c21 100644
--- a/net/llc/llc_if.c
+++ b/net/llc/llc_if.c
@@ -38,6 +38,8 @@
* closed and -EBUSY when sending data is not permitted in this state or
* LLC has send an I pdu with p bit set to 1 and is waiting for it's
* response.
+ *
+ * This function always consumes a reference to the skb.
*/
int llc_build_and_send_pkt(struct sock *sk, struct sk_buff *skb)
{
@@ -46,20 +48,22 @@ int llc_build_and_send_pkt(struct sock *sk, struct sk_buff *skb)
struct llc_sock *llc = llc_sk(sk);
if (unlikely(llc->state == LLC_CONN_STATE_ADM))
- goto out;
+ goto out_free;
rc = -EBUSY;
if (unlikely(llc_data_accept_state(llc->state) || /* data_conn_refuse */
llc->p_flag)) {
llc->failed_data_req = 1;
- goto out;
+ goto out_free;
}
ev = llc_conn_ev(skb);
ev->type = LLC_CONN_EV_TYPE_PRIM;
ev->prim = LLC_DATA_PRIM;
ev->prim_type = LLC_PRIM_TYPE_REQ;
skb->dev = llc->dev;
- rc = llc_conn_state_process(sk, skb);
-out:
+ return llc_conn_state_process(sk, skb);
+
+out_free:
+ kfree_skb(skb);
return rc;
}