aboutsummaryrefslogtreecommitdiffstats
path: root/res
diff options
context:
space:
mode:
authorrussell <russell@f38db490-d61c-443f-a65b-d21fe96a405b>2009-04-27 19:00:54 +0000
committerrussell <russell@f38db490-d61c-443f-a65b-d21fe96a405b>2009-04-27 19:00:54 +0000
commit9d509536416ceb97563e6242dd080481dd277db2 (patch)
tree1be38b640afd7f6c5ae59ad04bfdbe48d04567f7 /res
parentd7cfa403bba47e6665e487695c3f8384f7a4eb21 (diff)
Resolve a crash in res_smdi when used with chan_dahdi.
When chan_dahdi goes to get an SMDI message, it provides no search criteria. It just grabs the next message that arrives. This code was written with the SMDI dialplan functions in mind, since that is now the preferred method of using SMDI. However, this broke support of it being used from chan_dahdi. (closes AST-212) git-svn-id: http://svn.digium.com/svn/asterisk/branches/1.4@190661 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'res')
-rw-r--r--res/res_smdi.c28
1 files changed, 26 insertions, 2 deletions
diff --git a/res/res_smdi.c b/res/res_smdi.c
index 406a740c9..e13b5d4d9 100644
--- a/res/res_smdi.c
+++ b/res/res_smdi.c
@@ -383,7 +383,18 @@ static void *smdi_msg_find(struct ast_smdi_interface *iface,
switch (type) {
case SMDI_MD:
- if (ast_test_flag(&options, OPT_SEARCH_TERMINAL)) {
+ if (ast_strlen_zero(search_key)) {
+ struct ast_smdi_md_message *md_msg = NULL;
+
+ /* No search key provided (the code from chan_dahdi does this).
+ * Just pop the top message off of the queue. */
+
+ ASTOBJ_CONTAINER_TRAVERSE(&iface->md_q, !md_msg, do {
+ md_msg = ASTOBJ_REF(iterator);
+ } while (0); );
+
+ msg = md_msg;
+ } else if (ast_test_flag(&options, OPT_SEARCH_TERMINAL)) {
struct ast_smdi_md_message *md_msg = NULL;
/* Searching by the message desk terminal */
@@ -411,7 +422,20 @@ static void *smdi_msg_find(struct ast_smdi_interface *iface,
}
break;
case SMDI_MWI:
- msg = ASTOBJ_CONTAINER_FIND(&iface->mwi_q, search_key);
+ if (ast_strlen_zero(search_key)) {
+ msg = ASTOBJ_CONTAINER_FIND(&iface->mwi_q, search_key);
+ } else {
+ struct ast_smdi_mwi_message *mwi_msg = NULL;
+
+ /* No search key provided (the code from chan_dahdi does this).
+ * Just pop the top message off of the queue. */
+
+ ASTOBJ_CONTAINER_TRAVERSE(&iface->mwi_q, !mwi_msg, do {
+ mwi_msg = ASTOBJ_REF(iterator);
+ } while (0); );
+
+ msg = mwi_msg;
+ }
break;
}