[asterisk-commits] file: branch 13 r427711 - in /branches/13: ./ main/pbx.c
SVN commits to the Asterisk project
asterisk-commits at lists.digium.com
Wed Nov 12 10:12:35 CST 2014
Author: file
Date: Wed Nov 12 10:12:32 2014
New Revision: 427711
URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=427711
Log:
pbx: Fix off-nominal case where a freed extension may still be used.
If during the operation of adding an extension a priority is added but
fails it is possible for the extension to be freed but still exist in
the PBX core. If this occurs subsequent lookups may try to access the
extension and end up in freed memory.
This change removes the extension from the PBX core when the priority
addition fails and then frees the extension.
ASTERISK-24444 #close
Reported by: Leandro Dardini
Review: https://reviewboard.asterisk.org/r/4162/
........
Merged revisions 427709 from http://svn.asterisk.org/svn/asterisk/branches/11
........
Merged revisions 427710 from http://svn.asterisk.org/svn/asterisk/branches/12
Modified:
branches/13/ (props changed)
branches/13/main/pbx.c
Propchange: branches/13/
------------------------------------------------------------------------------
Binary property 'branch-12-merged' - no diff available.
Modified: branches/13/main/pbx.c
URL: http://svnview.digium.com/svn/asterisk/branches/13/main/pbx.c?view=diff&rev=427711&r1=427710&r2=427711
==============================================================================
--- branches/13/main/pbx.c (original)
+++ branches/13/main/pbx.c Wed Nov 12 10:12:32 2014
@@ -9791,13 +9791,7 @@
"Unable to register extension '%s' priority %d in '%s', already in use\n",
tmp->exten, tmp->priority, con->name);
}
- if (tmp->datad) {
- tmp->datad(tmp->data);
- /* if you free this, null it out */
- tmp->data = NULL;
- }
-
- ast_free(tmp);
+
return -1;
}
/* we are replacing e, so copy the link fields and then update
@@ -10081,6 +10075,26 @@
}
if (e && res == 0) { /* exact match, insert in the priority chain */
res = add_priority(con, tmp, el, e, replace);
+ if (res < 0) {
+ if (con->pattern_tree) {
+ struct match_char *x = add_exten_to_pattern_tree(con, tmp, 1);
+
+ if (x->exten) {
+ x->deleted = 1;
+ x->exten = 0;
+ }
+
+ ast_hashtab_remove_this_object(con->root_table, tmp);
+ }
+
+ if (tmp->datad) {
+ tmp->datad(tmp->data);
+ /* if you free this, null it out */
+ tmp->data = NULL;
+ }
+
+ ast_free(tmp);
+ }
if (lock_context) {
ast_unlock_context(con);
}
More information about the asterisk-commits
mailing list