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.
This commit is contained in:
parent
667d2d3cbb
commit
bf1be57101
@ -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))];
|
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 */
|
/* put it in the bucket in the vtag hash of assoc's for the system */
|
||||||
LIST_INSERT_HEAD(head, stcb, sctp_asocs);
|
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();
|
SCTP_INP_INFO_WUNLOCK();
|
||||||
|
|
||||||
if ((err = sctp_add_remote_addr(stcb, firstaddr, SCTP_DO_SETSCOPE, SCTP_ALLOC_ASOC))) {
|
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);
|
SCTP_FREE(asoc->mapping_array, SCTP_M_MAP);
|
||||||
asoc->mapping_array = NULL;
|
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_DECR_ASOC_COUNT();
|
||||||
SCTP_TCB_LOCK_DESTROY(stcb);
|
SCTP_TCB_LOCK_DESTROY(stcb);
|
||||||
SCTP_TCB_SEND_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);
|
SCTP_FREE(asoc->mapping_array, SCTP_M_MAP);
|
||||||
asoc->mapping_array = NULL;
|
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 */
|
/* the stream outs */
|
||||||
if (asoc->strmout) {
|
if (asoc->strmout) {
|
||||||
SCTP_FREE(asoc->strmout, SCTP_M_STRMO);
|
SCTP_FREE(asoc->strmout, SCTP_M_STRMO);
|
||||||
@ -6378,21 +6383,6 @@ sctp_is_vtag_good(struct sctp_inpcb *inp, uint32_t tag, uint16_t lport, uint16_t
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
SCTP_INP_INFO_RUNLOCK();
|
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);
|
return (1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -917,24 +917,7 @@ sctp_init_asoc(struct sctp_inpcb *m, struct sctp_tcb *stcb,
|
|||||||
#endif
|
#endif
|
||||||
asoc->sb_send_resv = 0;
|
asoc->sb_send_resv = 0;
|
||||||
if (override_tag) {
|
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;
|
asoc->my_vtag = override_tag;
|
||||||
#endif
|
|
||||||
} else {
|
} else {
|
||||||
asoc->my_vtag = sctp_select_a_tag(m, stcb->sctp_ep->sctp_lport, stcb->rport, 1);
|
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;
|
asoc->nr_mapping_array_size = SCTP_INITIAL_NR_MAPPING_ARRAY;
|
||||||
SCTP_MALLOC(asoc->nr_mapping_array, uint8_t *, asoc->nr_mapping_array_size,
|
SCTP_MALLOC(asoc->nr_mapping_array, uint8_t *, asoc->nr_mapping_array_size,
|
||||||
SCTP_M_MAP);
|
SCTP_M_MAP);
|
||||||
/*
|
if (asoc->nr_mapping_array == NULL) {
|
||||||
* if (asoc->nr_mapping_array == NULL) { SCTP_FREE(asoc->strmout,
|
SCTP_FREE(asoc->strmout, SCTP_M_STRMO);
|
||||||
* SCTP_M_STRMO); SCTP_LTRACE_ERR_RET(NULL, stcb, NULL,
|
SCTP_FREE(asoc->mapping_array, SCTP_M_MAP);
|
||||||
* SCTP_FROM_SCTPUTIL, ENOMEM); return (ENOMEM); }
|
SCTP_LTRACE_ERR_RET(NULL, stcb, NULL, SCTP_FROM_SCTPUTIL, ENOMEM);
|
||||||
*/
|
return (ENOMEM);
|
||||||
|
}
|
||||||
memset(asoc->nr_mapping_array, 0, asoc->nr_mapping_array_size);
|
memset(asoc->nr_mapping_array, 0, asoc->nr_mapping_array_size);
|
||||||
|
|
||||||
/* Now the init of the other outqueues */
|
/* Now the init of the other outqueues */
|
||||||
|
Loading…
Reference in New Issue
Block a user