Patch "net: sctp: fix skb leak in sctp_inq_free()" has been added to the 6.6-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    net: sctp: fix skb leak in sctp_inq_free()

to the 6.6-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     net-sctp-fix-skb-leak-in-sctp_inq_free.patch
and it can be found in the queue-6.6 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit 415ebef6ccfb87812b9b4077a901dd24ffb1a48d
Author: Dmitry Antipov <dmantipov@xxxxxxxxx>
Date:   Wed Feb 14 11:22:24 2024 +0300

    net: sctp: fix skb leak in sctp_inq_free()
    
    [ Upstream commit 4e45170d9acc2d5ae8f545bf3f2f67504a361338 ]
    
    In case of GSO, 'chunk->skb' pointer may point to an entry from
    fraglist created in 'sctp_packet_gso_append()'. To avoid freeing
    random fraglist entry (and so undefined behavior and/or memory
    leak), introduce 'sctp_inq_chunk_free()' helper to ensure that
    'chunk->skb' is set to 'chunk->head_skb' (i.e. fraglist head)
    before calling 'sctp_chunk_free()', and use the aforementioned
    helper in 'sctp_inq_pop()' as well.
    
    Reported-by: syzbot+8bb053b5d63595ab47db@xxxxxxxxxxxxxxxxxxxxxxxxx
    Closes: https://syzkaller.appspot.com/bug?id=0d8351bbe54fd04a492c2daab0164138db008042
    Fixes: 90017accff61 ("sctp: Add GSO support")
    Suggested-by: Xin Long <lucien.xin@xxxxxxxxx>
    Signed-off-by: Dmitry Antipov <dmantipov@xxxxxxxxx>
    Acked-by: Xin Long <lucien.xin@xxxxxxxxx>
    Link: https://lore.kernel.org/r/20240214082224.10168-1-dmantipov@xxxxxxxxx
    Signed-off-by: Jakub Kicinski <kuba@xxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/net/sctp/inqueue.c b/net/sctp/inqueue.c
index 7182c5a450fb5..5c16521818058 100644
--- a/net/sctp/inqueue.c
+++ b/net/sctp/inqueue.c
@@ -38,6 +38,14 @@ void sctp_inq_init(struct sctp_inq *queue)
 	INIT_WORK(&queue->immediate, NULL);
 }
 
+/* Properly release the chunk which is being worked on. */
+static inline void sctp_inq_chunk_free(struct sctp_chunk *chunk)
+{
+	if (chunk->head_skb)
+		chunk->skb = chunk->head_skb;
+	sctp_chunk_free(chunk);
+}
+
 /* Release the memory associated with an SCTP inqueue.  */
 void sctp_inq_free(struct sctp_inq *queue)
 {
@@ -53,7 +61,7 @@ void sctp_inq_free(struct sctp_inq *queue)
 	 * free it as well.
 	 */
 	if (queue->in_progress) {
-		sctp_chunk_free(queue->in_progress);
+		sctp_inq_chunk_free(queue->in_progress);
 		queue->in_progress = NULL;
 	}
 }
@@ -130,9 +138,7 @@ struct sctp_chunk *sctp_inq_pop(struct sctp_inq *queue)
 				goto new_skb;
 			}
 
-			if (chunk->head_skb)
-				chunk->skb = chunk->head_skb;
-			sctp_chunk_free(chunk);
+			sctp_inq_chunk_free(chunk);
 			chunk = queue->in_progress = NULL;
 		} else {
 			/* Nothing to do. Next chunk in the packet, please. */




[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux