aboutsummaryrefslogtreecommitdiffstats
path: root/net/sctp
diff options
context:
space:
mode:
authorVlad Yasevich <vladislav.yasevich@hp.com>2010-04-30 22:39:26 -0400
committerVlad Yasevich <vladislav.yasevich@hp.com>2010-04-30 22:39:26 -0400
commitfbdf501c9374966a56829ecca3a7f25d2b49a305 (patch)
treef52fae427ba1c58789e1fc2f11a47725ea132f1d /net/sctp
parentbc4f841a05364b2572bcc266e9fd7e9cf5f06d5b (diff)
sctp: Do no select unconfirmed transports for retransmissions
An unconfirmed transport is one that we have not been able to reach since the beginning. There is no point in trying to retrasnmit data on those transports. Also, the specification forbids it due to security issues. Reported-by: Frank Schuster <frank.schuster01@web.de> Signed-off-by: Vlad Yasevich <vladislav.yasevich@hp.com>
Diffstat (limited to 'net/sctp')
-rw-r--r--net/sctp/associola.c5
1 files changed, 3 insertions, 2 deletions
diff --git a/net/sctp/associola.c b/net/sctp/associola.c
index df5abbff63e2..de830c268564 100644
--- a/net/sctp/associola.c
+++ b/net/sctp/associola.c
@@ -762,7 +762,8 @@ struct sctp_transport *sctp_assoc_add_peer(struct sctp_association *asoc,
762 asoc->peer.retran_path = peer; 762 asoc->peer.retran_path = peer;
763 } 763 }
764 764
765 if (asoc->peer.active_path == asoc->peer.retran_path) { 765 if (asoc->peer.active_path == asoc->peer.retran_path &&
766 peer->state != SCTP_UNCONFIRMED) {
766 asoc->peer.retran_path = peer; 767 asoc->peer.retran_path = peer;
767 } 768 }
768 769
@@ -1318,7 +1319,7 @@ void sctp_assoc_update_retran_path(struct sctp_association *asoc)
1318 /* Keep track of the next transport in case 1319 /* Keep track of the next transport in case
1319 * we don't find any active transport. 1320 * we don't find any active transport.
1320 */ 1321 */
1321 if (!next) 1322 if (t->state != SCTP_UNCONFIRMED && !next)
1322 next = t; 1323 next = t;
1323 } 1324 }
1324 } 1325 }