diff options
author | Damien Wedhorn <voip@facts.com.au> | 2013-01-20 03:06:28 +0000 |
---|---|---|
committer | Damien Wedhorn <voip@facts.com.au> | 2013-01-20 03:06:28 +0000 |
commit | 822f5f5ff1826af11175e5dd026ec35eba443a07 (patch) | |
tree | c996018b5926dc0152cabc08f4af82101b0777ee | |
parent | e6a3674150b01d2126b4a653cd10ea1ab6f3b09d (diff) |
Fix issues with skinny sessions
Fixes a couple of issues with the way skinny handles sessions by ensuring
sessions aren't used after being freed. Some other minor changes.
Review: https://reviewboard.asterisk.org/r/2272/
........
Merged revisions 379582 from http://svn.asterisk.org/svn/asterisk/branches/11
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@379583 65c4cc65-6c06-0410-ace0-fbb531ad65f3
-rw-r--r-- | channels/chan_skinny.c | 19 |
1 files changed, 13 insertions, 6 deletions
diff --git a/channels/chan_skinny.c b/channels/chan_skinny.c index 4ca5fba44..01ed1b3e8 100644 --- a/channels/chan_skinny.c +++ b/channels/chan_skinny.c @@ -6865,15 +6865,21 @@ static void destroy_session(struct skinnysession *s) AST_LIST_TRAVERSE_SAFE_BEGIN(&sessions, cur, list) { if (cur == s) { AST_LIST_REMOVE_CURRENT(list); - if (s->fd > -1) + if (s->fd > -1) { close(s->fd); + } - if (!s->device) - ast_atomic_fetchadd_int(&unauth_sessions, -1); + if (s->device) { + s->device->session = NULL; + } else { + ast_atomic_fetchadd_int(&unauth_sessions, -1); + } ast_mutex_destroy(&s->lock); ast_free(s); + + break; } } AST_LIST_TRAVERSE_SAFE_END @@ -7011,21 +7017,22 @@ static void *skinny_session(void *data) res = get_input(s); if (res < 0) { ast_verb(3, "Ending Skinny session from %s (bad input)\n", ast_inet_ntoa(s->sin.sin_addr)); - break; + destroy_session(s); + return NULL; } if (res > 0) { if (!(req = skinny_req_parse(s))) { - destroy_session(s); ast_verb(3, "Ending Skinny session from %s (failed parse)\n", ast_inet_ntoa(s->sin.sin_addr)); + destroy_session(s); return NULL; } res = handle_message(req, s); if (res < 0) { - destroy_session(s); ast_verb(3, "Ending Skinny session from %s\n", ast_inet_ntoa(s->sin.sin_addr)); + destroy_session(s); return NULL; } } |