summaryrefslogtreecommitdiffstats
path: root/sys/netinet
diff options
context:
space:
mode:
authorrrs <rrs@FreeBSD.org>2009-05-30 10:56:27 +0000
committerrrs <rrs@FreeBSD.org>2009-05-30 10:56:27 +0000
commit138c7701ba283e55cdbfdc609ff46dc403482a8e (patch)
tree0eafcf3af43c9c179c4f126f8c36b987d16c2009 /sys/netinet
parentb2dff4f4a9fcbfe52715e8530c4a7993bac02f9e (diff)
downloadFreeBSD-src-138c7701ba283e55cdbfdc609ff46dc403482a8e.zip
FreeBSD-src-138c7701ba283e55cdbfdc609ff46dc403482a8e.tar.gz
Fix a small memory leak from the nr-sack code - the mapping array
was not being freed at term of association. Also get rid of the MICHAELS_EXP code.
Diffstat (limited to 'sys/netinet')
-rw-r--r--sys/netinet/sctp_pcb.c26
-rw-r--r--sys/netinet/sctputil.c28
2 files changed, 14 insertions, 40 deletions
diff --git a/sys/netinet/sctp_pcb.c b/sys/netinet/sctp_pcb.c
index df519cc..ac25d15 100644
--- a/sys/netinet/sctp_pcb.c
+++ b/sys/netinet/sctp_pcb.c
@@ -4104,9 +4104,6 @@ sctp_aloc_assoc(struct sctp_inpcb *inp, struct sockaddr *firstaddr,
head = &SCTP_BASE_INFO(sctp_asochash)[SCTP_PCBHASH_ASOC(stcb->asoc.my_vtag, SCTP_BASE_INFO(hashasocmark))];
/* put it in the bucket in the vtag hash of assoc's for the system */
LIST_INSERT_HEAD(head, stcb, sctp_asocs);
-#ifdef MICHAELS_EXPERIMENT
- sctp_delete_from_timewait(stcb->asoc.my_vtag, inp->sctp_lport, stcb->rport);
-#endif
SCTP_INP_INFO_WUNLOCK();
if ((err = sctp_add_remote_addr(stcb, firstaddr, SCTP_DO_SETSCOPE, SCTP_ALLOC_ASOC))) {
@@ -4119,6 +4116,10 @@ sctp_aloc_assoc(struct sctp_inpcb *inp, struct sockaddr *firstaddr,
SCTP_FREE(asoc->mapping_array, SCTP_M_MAP);
asoc->mapping_array = NULL;
}
+ if (asoc->nr_mapping_array) {
+ SCTP_FREE(asoc->nr_mapping_array, SCTP_M_MAP);
+ asoc->nr_mapping_array = NULL;
+ }
SCTP_DECR_ASOC_COUNT();
SCTP_TCB_LOCK_DESTROY(stcb);
SCTP_TCB_SEND_LOCK_DESTROY(stcb);
@@ -4881,6 +4882,10 @@ sctp_free_assoc(struct sctp_inpcb *inp, struct sctp_tcb *stcb, int from_inpcbfre
SCTP_FREE(asoc->mapping_array, SCTP_M_MAP);
asoc->mapping_array = NULL;
}
+ if (asoc->nr_mapping_array) {
+ SCTP_FREE(asoc->nr_mapping_array, SCTP_M_MAP);
+ asoc->nr_mapping_array = NULL;
+ }
/* the stream outs */
if (asoc->strmout) {
SCTP_FREE(asoc->strmout, SCTP_M_STRMO);
@@ -6378,21 +6383,6 @@ skip_vtag_check:
}
}
SCTP_INP_INFO_RUNLOCK();
-#ifdef MICHAELS_EXPERIMENT
- /*-
- * Not found, ok to use the tag, add it to the time wait hash
- * as well this will prevent two sucessive cookies from getting
- * the same tag or two inits sent quickly on multi-processors.
- * We only keep the tag for the life of a cookie and when we
- * add this tag to the assoc hash we need to purge it from
- * the t-wait hash.
- */
- SCTP_INP_INFO_WLOCK();
- if (save_in_twait)
- sctp_add_vtag_to_timewait(tag, TICKS_TO_SEC(inp->sctp_ep.def_cookie_life, lport, rport));
- SCTP_INP_INFO_WUNLOCK();
-#endif
-
return (1);
}
diff --git a/sys/netinet/sctputil.c b/sys/netinet/sctputil.c
index aea7376..8797d71 100644
--- a/sys/netinet/sctputil.c
+++ b/sys/netinet/sctputil.c
@@ -917,24 +917,7 @@ sctp_init_asoc(struct sctp_inpcb *m, struct sctp_tcb *stcb,
#endif
asoc->sb_send_resv = 0;
if (override_tag) {
-#ifdef MICHAELS_EXPERIMENT
- if (sctp_is_in_timewait(override_tag, stcb->sctp_ep->sctp_lport, stcb->rport)) {
- /*
- * It must be in the time-wait hash, we put it there
- * when we aloc one. If not the peer is playing
- * games.
- */
- asoc->my_vtag = override_tag;
- } else {
- SCTP_LTRACE_ERR_RET(NULL, stcb, NULL, SCTP_FROM_SCTPUTIL, ENOMEM);
-#ifdef INVARIANTS
- panic("Huh is_in_timewait fails");
-#endif
- return (ENOMEM);
- }
-#else
asoc->my_vtag = override_tag;
-#endif
} else {
asoc->my_vtag = sctp_select_a_tag(m, stcb->sctp_ep->sctp_lport, stcb->rport, 1);
}
@@ -1159,11 +1142,12 @@ sctp_init_asoc(struct sctp_inpcb *m, struct sctp_tcb *stcb,
asoc->nr_mapping_array_size = SCTP_INITIAL_NR_MAPPING_ARRAY;
SCTP_MALLOC(asoc->nr_mapping_array, uint8_t *, asoc->nr_mapping_array_size,
SCTP_M_MAP);
- /*
- * if (asoc->nr_mapping_array == NULL) { SCTP_FREE(asoc->strmout,
- * SCTP_M_STRMO); SCTP_LTRACE_ERR_RET(NULL, stcb, NULL,
- * SCTP_FROM_SCTPUTIL, ENOMEM); return (ENOMEM); }
- */
+ if (asoc->nr_mapping_array == NULL) {
+ SCTP_FREE(asoc->strmout, SCTP_M_STRMO);
+ SCTP_FREE(asoc->mapping_array, SCTP_M_MAP);
+ SCTP_LTRACE_ERR_RET(NULL, stcb, NULL, SCTP_FROM_SCTPUTIL, ENOMEM);
+ return (ENOMEM);
+ }
memset(asoc->nr_mapping_array, 0, asoc->nr_mapping_array_size);
/* Now the init of the other outqueues */
OpenPOWER on IntegriCloud