Invalid read in ast_channel_set_caller_event().

Valgrind reported that ast_channel_set_caller_event() was reading data
from a freed buffer when using the pre_set structure.

Rearange things to pre-calculate the name and number pointer before
updating the caller party structure to see if the name or number was
changed.


git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/1.8@308903 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
Richard Mudgett
2011-02-24 21:38:41 +00:00
parent 463a39b5d1
commit 6fb282becb

View File

@@ -6641,7 +6641,8 @@ void ast_channel_set_caller(struct ast_channel *chan, const struct ast_party_cal
void ast_channel_set_caller_event(struct ast_channel *chan, const struct ast_party_caller *caller, const struct ast_set_party_caller *update) void ast_channel_set_caller_event(struct ast_channel *chan, const struct ast_party_caller *caller, const struct ast_set_party_caller *update)
{ {
struct ast_party_caller pre_set; const char *pre_set_number;
const char *pre_set_name;
if (&chan->caller == caller) { if (&chan->caller == caller) {
/* Don't set to self */ /* Don't set to self */
@@ -6649,12 +6650,14 @@ void ast_channel_set_caller_event(struct ast_channel *chan, const struct ast_par
} }
ast_channel_lock(chan); ast_channel_lock(chan);
pre_set = chan->caller; pre_set_number =
S_COR(chan->caller.id.number.valid, chan->caller.id.number.str, NULL);
pre_set_name = S_COR(chan->caller.id.name.valid, chan->caller.id.name.str, NULL);
ast_party_caller_set(&chan->caller, caller, update); ast_party_caller_set(&chan->caller, caller, update);
if (S_COR(pre_set.id.number.valid, pre_set.id.number.str, NULL) if (S_COR(chan->caller.id.number.valid, chan->caller.id.number.str, NULL)
!= S_COR(chan->caller.id.number.valid, chan->caller.id.number.str, NULL) != pre_set_number
|| S_COR(pre_set.id.name.valid, pre_set.id.name.str, NULL) || S_COR(chan->caller.id.name.valid, chan->caller.id.name.str, NULL)
!= S_COR(chan->caller.id.name.valid, chan->caller.id.name.str, NULL)) { != pre_set_name) {
/* The caller id name or number changed. */ /* The caller id name or number changed. */
report_new_callerid(chan); report_new_callerid(chan);
} }