Merged revisions 287757 via svnmerge from

https://origsvn.digium.com/svn/asterisk/branches/1.8

........
  r287757 | twilson | 2010-09-20 18:51:38 -0500 (Mon, 20 Sep 2010) | 7 lines
  
  Avoid infinite loop with certain local channel connected line updates
  
  Compare connected line data before sending a connected line indication to avoid
  possible loops.
  
  Review: https://reviewboard.asterisk.org/r/932/
........


git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@287764 65c4cc65-6c06-0410-ace0-fbb531ad65f3
10-digiumphones
Terry Wilson 15 years ago
parent e8de16e970
commit 03a833f2e8

@ -8227,11 +8227,38 @@ int ast_connected_line_parse_data(const unsigned char *data, size_t datalen, str
return 0;
}
/*! \brief Determine if two ast_party_connected_line structures differ
*
* \param c1 One of the structs to compare
* \param c2 The other struct to compare
* \retval 0 No difference or one of the structs is NULL
* \retval non-zero The structs differ
*/
static int connected_line_differ(const struct ast_party_connected_line *c1, const struct ast_party_connected_line *c2)
{
unsigned char buf1[1024] = { 0, };
unsigned char buf2[sizeof(buf1)] = { 0, };
if (!c1 || !c2) {
return 0;
}
ast_connected_line_build_data(buf1, sizeof(buf1), c1, NULL);
ast_connected_line_build_data(buf2, sizeof(buf2), c2, NULL);
return memcmp(buf1, buf2, sizeof(buf1));
}
void ast_channel_update_connected_line(struct ast_channel *chan, const struct ast_party_connected_line *connected, const struct ast_set_party_connected_line *update)
{
unsigned char data[1024]; /* This should be large enough */
size_t datalen;
if (!connected_line_differ(&chan->connected, connected)) {
ast_debug(1, "No change, so ignoring update\n");
return;
}
datalen = ast_connected_line_build_data(data, sizeof(data), connected, update);
if (datalen == (size_t) -1) {
return;

Loading…
Cancel
Save