diff options
Diffstat (limited to 'net/sctp/sm_make_chunk.c')
-rw-r--r-- | net/sctp/sm_make_chunk.c | 12 |
1 files changed, 8 insertions, 4 deletions
diff --git a/net/sctp/sm_make_chunk.c b/net/sctp/sm_make_chunk.c index 5baed9bb7de5..773cd93fa3d0 100644 --- a/net/sctp/sm_make_chunk.c +++ b/net/sctp/sm_make_chunk.c | |||
@@ -1003,6 +1003,7 @@ struct sctp_chunk *sctp_chunkify(struct sk_buff *skb, | |||
1003 | SCTP_DEBUG_PRINTK("chunkifying skb %p w/o an sk\n", skb); | 1003 | SCTP_DEBUG_PRINTK("chunkifying skb %p w/o an sk\n", skb); |
1004 | } | 1004 | } |
1005 | 1005 | ||
1006 | INIT_LIST_HEAD(&retval->list); | ||
1006 | retval->skb = skb; | 1007 | retval->skb = skb; |
1007 | retval->asoc = (struct sctp_association *)asoc; | 1008 | retval->asoc = (struct sctp_association *)asoc; |
1008 | retval->resent = 0; | 1009 | retval->resent = 0; |
@@ -1116,8 +1117,7 @@ static void sctp_chunk_destroy(struct sctp_chunk *chunk) | |||
1116 | /* Possibly, free the chunk. */ | 1117 | /* Possibly, free the chunk. */ |
1117 | void sctp_chunk_free(struct sctp_chunk *chunk) | 1118 | void sctp_chunk_free(struct sctp_chunk *chunk) |
1118 | { | 1119 | { |
1119 | /* Make sure that we are not on any list. */ | 1120 | BUG_ON(!list_empty(&chunk->list)); |
1120 | skb_unlink((struct sk_buff *) chunk); | ||
1121 | list_del_init(&chunk->transmitted_list); | 1121 | list_del_init(&chunk->transmitted_list); |
1122 | 1122 | ||
1123 | /* Release our reference on the message tracker. */ | 1123 | /* Release our reference on the message tracker. */ |
@@ -2739,8 +2739,12 @@ int sctp_process_asconf_ack(struct sctp_association *asoc, | |||
2739 | asoc->addip_last_asconf = NULL; | 2739 | asoc->addip_last_asconf = NULL; |
2740 | 2740 | ||
2741 | /* Send the next asconf chunk from the addip chunk queue. */ | 2741 | /* Send the next asconf chunk from the addip chunk queue. */ |
2742 | asconf = (struct sctp_chunk *)__skb_dequeue(&asoc->addip_chunks); | 2742 | if (!list_empty(&asoc->addip_chunk_list)) { |
2743 | if (asconf) { | 2743 | struct list_head *entry = asoc->addip_chunk_list.next; |
2744 | asconf = list_entry(entry, struct sctp_chunk, list); | ||
2745 | |||
2746 | list_del_init(entry); | ||
2747 | |||
2744 | /* Hold the chunk until an ASCONF_ACK is received. */ | 2748 | /* Hold the chunk until an ASCONF_ACK is received. */ |
2745 | sctp_chunk_hold(asconf); | 2749 | sctp_chunk_hold(asconf); |
2746 | if (sctp_primitive_ASCONF(asoc, asconf)) | 2750 | if (sctp_primitive_ASCONF(asoc, asconf)) |