*** C:\work\SipBugs\Phone\MemoryLeak\fs_stable\nta_ORIGINAL.c 2014-02-20 18:43:27.000000000 -0700 --- C:\work\SipBugs\Phone\MemoryLeak\fs_stable\nta_PATCHED.c 2014-05-21 12:14:39.000000000 -0700 *************** *** 9166,9175 **** --- 9166,9187 ---- } return orq; } /** destroy msg if no timeout set on receive outgoing */ + int check_outgoing_recv_timeout(nta_outgoing_t *original, msg_t *msg) + { + SU_DEBUG_5(("nta %s: orq_timeout=%d.\n","check_outgoing_recv_timeout",original->orq_timeout)); + if(original->orq_timeout==0){ + outgoing_remove(original); + msg_destroy(msg); + return 0; + } + return original->orq_timeout; + } /** Process a response message. */ int outgoing_recv(nta_outgoing_t *_orq, int status, msg_t *msg, sip_t *sip) *************** *** 9232,9248 **** --- 9244,9264 ---- original->orq_status = status; if (orq->orq_status < 200) orq->orq_status = status; if (original->orq_queue == sa->sa_out.inv_calling) { outgoing_queue(sa->sa_out.inv_proceeding, original); + if(check_outgoing_recv_timeout(original,msg)==0) + return 0; } else if (original->orq_queue == sa->sa_out.inv_proceeding) { if (sa->sa_out.inv_proceeding->q_timeout) { outgoing_remove(original); outgoing_queue(sa->sa_out.inv_proceeding, original); + if(check_outgoing_recv_timeout(original,msg)==0) + return 0; } } /* Handle 100rel */ if (sip && sip->sip_rseq) { if (outgoing_recv_reliable(orq, msg, sip) < 0) {