From: Olle Johansson Date: Wed, 25 Oct 2006 19:16:10 +0000 (+0000) Subject: Somewhat ugly code to try to fix issue #7608. X-Git-Tag: 1.4.0-beta4~273 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=b36a4fad1b158af828b3e5f7c5eae227338a77c6;p=thirdparty%2Fasterisk.git Somewhat ugly code to try to fix issue #7608. Since the problem was not very well defined, the fix is a bit fuzzy too... Thanks to Luigi for accidentally spotting the possible problem! git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/1.4@46252 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- diff --git a/channels/chan_sip.c b/channels/chan_sip.c index 504295e8f2..3c2bed690b 100644 --- a/channels/chan_sip.c +++ b/channels/chan_sip.c @@ -8029,7 +8029,8 @@ static int cb_extensionstate(char *context, char* exten, int state, void *data) p->laststate = state; break; } - transmit_state_notify(p, state, 1); + if (p->subscribed != NONE) /* Only send state NOTIFY if we know the format */ + transmit_state_notify(p, state, 1); if (option_verbose > 1) ast_verbose(VERBOSE_PREFIX_1 "Extension Changed %s new state %s for Notify User %s\n", exten, ast_extension_state2str(state), p->username); @@ -13885,9 +13886,10 @@ static int handle_request_subscribe(struct sip_pvt *p, struct sip_request *req, int res = 0; int firststate = AST_EXTENSION_REMOVED; struct sip_peer *authpeer = NULL; - const char *event = get_header(req, "Event"); /* Get Event package name */ + const char *eventheader = get_header(req, "Event"); /* Get Event package name */ const char *accept = get_header(req, "Accept"); int resubscribe = (p->subscribed != NONE); + char *temp, *event; if (p->initreq.headers) { /* We already have a dialog */ @@ -13918,22 +13920,34 @@ static int handle_request_subscribe(struct sip_pvt *p, struct sip_request *req, return 0; } - if (!ast_test_flag(req, SIP_PKT_IGNORE) && !p->initreq.headers) { /* Set up dialog, new subscription */ + if (!ast_test_flag(req, SIP_PKT_IGNORE) && !resubscribe) { /* Set up dialog, new subscription */ /* Use this as the basis */ if (ast_test_flag(req, SIP_PKT_DEBUG)) ast_verbose("Creating new subscription\n"); - /* This call is no longer outgoing if it ever was */ - ast_clear_flag(&p->flags[0], SIP_OUTGOING); copy_request(&p->initreq, req); check_via(p, req); } else if (ast_test_flag(req, SIP_PKT_DEBUG) && ast_test_flag(req, SIP_PKT_IGNORE)) ast_verbose("Ignoring this SUBSCRIBE request\n"); /* Find parameters to Event: header value and remove them for now */ - event = strsep((char **)&event, ";"); /* XXX bug here, overwrite string */ + if (ast_strlen_zero(eventheader)) { + transmit_response(p, "489 Bad Event", req); + if (option_debug > 1) + ast_log(LOG_DEBUG, "Received SIP subscribe for unknown event package: \n"); + ast_set_flag(&p->flags[0], SIP_NEEDDESTROY); + return 0; + } + + if ( (strchr(eventheader, ';'))) { + event = ast_strdupa(eventheader); /* Since eventheader is a const, we can't change it */ + temp = strchr(event, ';'); + *temp = '\0'; /* Remove any options for now */ + /* We might need to use them later :-) */ + } else + event = (char *) eventheader; /* XXX is this legal ? */ - /* Handle authentication if this is our first subscribe */ + /* Handle authentication */ res = check_user_full(p, req, SIP_SUBSCRIBE, e, 0, sin, &authpeer); /* if an authentication response was sent, we are done here */ if (res == AUTH_CHALLENGE_SENT)