aboutsummaryrefslogtreecommitdiffstats
path: root/channels
diff options
context:
space:
mode:
authorjpeeler <jpeeler@f38db490-d61c-443f-a65b-d21fe96a405b>2008-06-06 17:50:05 +0000
committerjpeeler <jpeeler@f38db490-d61c-443f-a65b-d21fe96a405b>2008-06-06 17:50:05 +0000
commit60bf6d123af52f5efe12725ae5924cf244284929 (patch)
tree363a71ee561056de973774f2510fb94e89f3b24c /channels
parentd7d5ebe84a078e4c5fe422411f6caddb4888ea3f (diff)
Merged revisions 120863,120885 via svnmerge from
https://origsvn.digium.com/svn/asterisk/branches/1.4 ........ r120863 | jpeeler | 2008-06-06 10:33:15 -0500 (Fri, 06 Jun 2008) | 3 lines This fixes a crash when LOW_MEMORY is turned on. Two allocations of the ast_rtp struct that were previously allocated on the stack have been modified to use thread local storage instead. ........ r120885 | jpeeler | 2008-06-06 11:39:20 -0500 (Fri, 06 Jun 2008) | 2 lines Correction to commmit 120863, make sure proper destructor function is called as well define two thread storage local variables. ........ git-svn-id: http://svn.digium.com/svn/asterisk/trunk@120906 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'channels')
-rw-r--r--channels/chan_sip.c23
1 files changed, 23 insertions, 0 deletions
diff --git a/channels/chan_sip.c b/channels/chan_sip.c
index b8e695200..6c31e395c 100644
--- a/channels/chan_sip.c
+++ b/channels/chan_sip.c
@@ -1723,6 +1723,12 @@ static void temp_pvt_cleanup(void *);
/*! \brief A per-thread temporary pvt structure */
AST_THREADSTORAGE_CUSTOM(ts_temp_pvt, temp_pvt_init, temp_pvt_cleanup);
+static void ts_ast_rtp_destroy(void *);
+
+AST_THREADSTORAGE_CUSTOM(ts_audio_rtp, NULL, ts_ast_rtp_destroy);
+AST_THREADSTORAGE_CUSTOM(ts_video_rtp, NULL, ts_ast_rtp_destroy);
+AST_THREADSTORAGE_CUSTOM(ts_text_rtp, NULL, ts_ast_rtp_destroy);
+
/*! \brief Authentication list for realm authentication
* \todo Move the sip_auth list to AST_LIST */
static struct sip_auth *authl = NULL;
@@ -6685,17 +6691,29 @@ static int process_sdp(struct sip_pvt *p, struct sip_request *req, int t38action
}
/* Initialize the temporary RTP structures we use to evaluate the offer from the peer */
+#ifdef LOW_MEMORY
+ newaudiortp = ast_threadstorage_get(&ts_audio_rtp, ast_rtp_alloc_size());
+#else
newaudiortp = alloca(ast_rtp_alloc_size());
+#endif
memset(newaudiortp, 0, ast_rtp_alloc_size());
ast_rtp_new_init(newaudiortp);
ast_rtp_pt_clear(newaudiortp);
+#ifdef LOW_MEMORY
+ newvideortp = ast_threadstorage_get(&ts_video_rtp, ast_rtp_alloc_size());
+#else
newvideortp = alloca(ast_rtp_alloc_size());
+#endif
memset(newvideortp, 0, ast_rtp_alloc_size());
ast_rtp_new_init(newvideortp);
ast_rtp_pt_clear(newvideortp);
+#ifdef LOW_MEMORY
+ newtextrtp = ast_threadstorage_get(&ts_text_rtp, ast_rtp_alloc_size());
+#else
newtextrtp = alloca(ast_rtp_alloc_size());
+#endif
memset(newtextrtp, 0, ast_rtp_alloc_size());
ast_rtp_new_init(newtextrtp);
ast_rtp_pt_clear(newtextrtp);
@@ -7364,6 +7382,11 @@ static int process_sdp(struct sip_pvt *p, struct sip_request *req, int t38action
return 0;
}
+static void ts_ast_rtp_destroy(void *data)
+{
+ struct ast_rtp *tmp = data;
+ ast_rtp_destroy(tmp);
+}
/*! \brief Add header to SIP message */
static int add_header(struct sip_request *req, const char *var, const char *value)