Patchwork [3.5.y.z,extended,stable] Patch "sctp: refactor sctp_outq_teardown to insure proper" has been added to staging queue

mail settings
Submitter Herton Ronaldo Krzesinski
Date Feb. 15, 2013, 3:11 a.m.
Message ID <>
Download mbox | patch
Permalink /patch/220608/
State New
Headers show


Herton Ronaldo Krzesinski - Feb. 15, 2013, 3:11 a.m.
This is a note to let you know that I have just added a patch titled

    sctp: refactor sctp_outq_teardown to insure proper

to the linux-3.5.y-queue branch of the 3.5.y.z extended stable tree 
which can be found at:;a=shortlog;h=refs/heads/linux-3.5.y-queue

If you, or anyone else, feels it should not be added to this tree, please 
reply to this email.

For more information about the 3.5.y.z tree, see



From c749be1458b2046faaeb42ff7cf2a07f0627fd24 Mon Sep 17 00:00:00 2001
From: Neil Horman <>
Date: Thu, 17 Jan 2013 11:15:08 +0000
Subject: [PATCH] sctp: refactor sctp_outq_teardown to insure proper

commit 2f94aabd9f6c925d77aecb3ff020f1cc12ed8f86 upstream.

Jamie Parsons reported a problem recently, in which the re-initalization of an
association (The duplicate init case), resulted in a loss of receive window
space.  He tracked down the root cause to sctp_outq_teardown, which discarded
all the data on an outq during a re-initalization of the corresponding
association, but never reset the outq->outstanding_data field to zero.  I wrote,
and he tested this fix, which does a proper full re-initalization of the outq,
fixing this problem, and hopefully future proofing us from simmilar issues down
the road.

Signed-off-by: Neil Horman <>
Reported-by: Jamie Parsons <>
Tested-by: Jamie Parsons <>
CC: Jamie Parsons <>
CC: Vlad Yasevich <>
CC: "David S. Miller" <>
Acked-by: Vlad Yasevich <>
Signed-off-by: David S. Miller <>
Signed-off-by: Herton Ronaldo Krzesinski <>
 net/sctp/outqueue.c |   12 ++++++++----
 1 file changed, 8 insertions(+), 4 deletions(-)



diff --git a/net/sctp/outqueue.c b/net/sctp/outqueue.c
index a0fa19f..0716290 100644
--- a/net/sctp/outqueue.c
+++ b/net/sctp/outqueue.c
@@ -223,7 +223,7 @@  void sctp_outq_init(struct sctp_association *asoc, struct sctp_outq *q)

 /* Free the outqueue structure and any related pending chunks.
-void sctp_outq_teardown(struct sctp_outq *q)
+static void __sctp_outq_teardown(struct sctp_outq *q)
 	struct sctp_transport *transport;
 	struct list_head *lchunk, *temp;
@@ -276,8 +276,6 @@  void sctp_outq_teardown(struct sctp_outq *q)

-	q->error = 0;
 	/* Throw away any leftover control chunks. */
 	list_for_each_entry_safe(chunk, tmp, &q->control_chunk_list, list) {
@@ -285,11 +283,17 @@  void sctp_outq_teardown(struct sctp_outq *q)

+void sctp_outq_teardown(struct sctp_outq *q)
+	__sctp_outq_teardown(q);
+	sctp_outq_init(q->asoc, q);
 /* Free the outqueue structure and any related pending chunks.  */
 void sctp_outq_free(struct sctp_outq *q)
 	/* Throw away leftover chunks. */
-	sctp_outq_teardown(q);
+	__sctp_outq_teardown(q);

 	/* If we were kmalloc()'d, free the memory.  */
 	if (q->malloced)