Compare commits

...

13 Commits

Author SHA1 Message Date
Leif Madsen
d69585a80e Importing release summary for 1.4.41.1 release.
git-svn-id: https://origsvn.digium.com/svn/asterisk/tags/1.4.41.1@324705 65c4cc65-6c06-0410-ace0-fbb531ad65f3
2011-06-23 18:41:18 +00:00
Leif Madsen
886f40576b Commit changes per AST-2011-010
git-svn-id: https://origsvn.digium.com/svn/asterisk/tags/1.4.41.1@324702 65c4cc65-6c06-0410-ace0-fbb531ad65f3
2011-06-23 18:39:08 +00:00
Leif Madsen
cb07f2e861 Create Asterisk 1.4.41.1 from 1.4.41
git-svn-id: https://origsvn.digium.com/svn/asterisk/tags/1.4.41.1@324626 65c4cc65-6c06-0410-ace0-fbb531ad65f3
2011-06-23 18:12:10 +00:00
Leif Madsen
9418c1ae89 Importing release summary for 1.4.41 release.
git-svn-id: https://origsvn.digium.com/svn/asterisk/tags/1.4.41@315208 65c4cc65-6c06-0410-ace0-fbb531ad65f3
2011-04-25 17:57:24 +00:00
Leif Madsen
d44cb3e5f7 Remove incorrect summary files in preparation for rebuilding.
git-svn-id: https://origsvn.digium.com/svn/asterisk/tags/1.4.41@315207 65c4cc65-6c06-0410-ace0-fbb531ad65f3
2011-04-25 17:55:38 +00:00
Leif Madsen
6c86622761 Importing release summary for 1.4.41 release.
git-svn-id: https://origsvn.digium.com/svn/asterisk/tags/1.4.41@315206 65c4cc65-6c06-0410-ace0-fbb531ad65f3
2011-04-25 17:44:38 +00:00
Leif Madsen
5ba7d1d6d8 Merge changes for AST-2011-005 and AST-2011-006
git-svn-id: https://origsvn.digium.com/svn/asterisk/tags/1.4.41@315205 65c4cc65-6c06-0410-ace0-fbb531ad65f3
2011-04-25 17:35:58 +00:00
Leif Madsen
74f9372ac3 Merge changes for AST-2011-005 and AST-2011-006, update .version and ChangeLog
git-svn-id: https://origsvn.digium.com/svn/asterisk/tags/1.4.41@315204 65c4cc65-6c06-0410-ace0-fbb531ad65f3
2011-04-25 17:33:41 +00:00
Leif Madsen
15929c9257 Create Asterisk 1.4.41 from 1.4.41-rc1
git-svn-id: https://origsvn.digium.com/svn/asterisk/tags/1.4.41@315203 65c4cc65-6c06-0410-ace0-fbb531ad65f3
2011-04-25 17:28:21 +00:00
Leif Madsen
dce2e0b730 Use autotagged externals
git-svn-id: https://origsvn.digium.com/svn/asterisk/tags/1.4.41-rc1@308628 65c4cc65-6c06-0410-ace0-fbb531ad65f3
2011-02-23 23:56:59 +00:00
Leif Madsen
ed34cb861c Importing release summary for 1.4.41-rc1 release.
git-svn-id: https://origsvn.digium.com/svn/asterisk/tags/1.4.41-rc1@308627 65c4cc65-6c06-0410-ace0-fbb531ad65f3
2011-02-23 23:56:56 +00:00
Leif Madsen
1d99327eb4 Importing files for 1.4.41-rc1 release.
git-svn-id: https://origsvn.digium.com/svn/asterisk/tags/1.4.41-rc1@308626 65c4cc65-6c06-0410-ace0-fbb531ad65f3
2011-02-23 23:56:52 +00:00
Leif Madsen
16232b6f40 Creating tag for the release of asterisk-1.4.41-rc1
git-svn-id: https://origsvn.digium.com/svn/asterisk/tags/1.4.41-rc1@308625 65c4cc65-6c06-0410-ace0-fbb531ad65f3
2011-02-23 23:56:11 +00:00
13 changed files with 32008 additions and 13 deletions

1
.lastclean Normal file
View File

@@ -0,0 +1 @@
33

1
.version Normal file
View File

@@ -0,0 +1 @@
1.4.41.1

31622
ChangeLog Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,62 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /><title>Release Summary - asterisk-1.4.41.1</title></head>
<body>
<h1 align="center"><a name="top">Release Summary</a></h1>
<h3 align="center">asterisk-1.4.41.1</h3>
<h3 align="center">Date: 2011-06-23</h3>
<h3 align="center">&lt;asteriskteam@digium.com&gt;</h3>
<hr/>
<h2 align="center">Table of Contents</h2>
<ol>
<li><a href="#summary">Summary</a></li>
<li><a href="#contributors">Contributors</a></li>
<li><a href="#commits">Other Changes</a></li>
<li><a href="#diffstat">Diffstat</a></li>
</ol>
<hr/>
<a name="summary"><h2 align="center">Summary</h2></a>
<center><a href="#top">[Back to Top]</a></center><br/><p>This release has been made to address one or more security vulnerabilities that have been identified. A security advisory document has been published for each vulnerability that includes additional information. Users of versions of Asterisk that are affected are strongly encouraged to review the advisories and determine what action they should take to protect their systems from these issues.</p>
<p>Security Advisories: <a href="http://downloads.asterisk.org/pub/security/AST-2011-010.html">AST-2011-010</a></p>
<p>The data in this summary reflects changes that have been made since the previous release, asterisk-1.4.41.</p>
<hr/>
<a name="contributors"><h2 align="center">Contributors</h2></a>
<center><a href="#top">[Back to Top]</a></center><br/><p>This table lists the people who have submitted code, those that have tested patches, as well as those that reported issues on the issue tracker that were resolved in this release. For coders, the number is how many of their patches (of any size) were committed into this release. For testers, the number is the number of times their name was listed as assisting with testing a patch. Finally, for reporters, the number is the number of issues that they reported that were closed by commits that went into this release.</p>
<table width="100%" border="0">
<tr>
<td width="33%"><h3>Coders</h3></td>
<td width="33%"><h3>Testers</h3></td>
<td width="33%"><h3>Reporters</h3></td>
</tr>
<tr valign="top">
<td>
2 lmadsen<br/>
</td>
<td>
</td>
<td>
</td>
</tr>
</table>
<hr/>
<a name="commits"><h2 align="center">Commits Not Associated with an Issue</h2></a>
<center><a href="#top">[Back to Top]</a></center><br/><p>This is a list of all changes that went into this release that did not directly close an issue from the issue tracker. The commits may have been marked as being related to an issue. If that is the case, the issue numbers are listed here, as well.</p>
<table width="100%" border="1">
<tr><td><b>Revision</b></td><td><b>Author</b></td><td><b>Summary</b></td><td><b>Issues Referenced</b></td></tr><tr><td><a href="http://svn.digium.com/view/asterisk/tags/1.4.41.1?view=revision&revision=324626">324626</a></td><td>lmadsen</td><td>Create Asterisk 1.4.41.1 from 1.4.41</td>
<td></td></tr><tr><td><a href="http://svn.digium.com/view/asterisk/tags/1.4.41.1?view=revision&revision=324702">324702</a></td><td>lmadsen</td><td>Commit changes per AST-2011-010</td>
<td></td></tr></table>
<hr/>
<a name="diffstat"><h2 align="center">Diffstat Results</h2></a>
<center><a href="#top">[Back to Top]</a></center><br/><p>This is a summary of the changes to the source code that went into this release that was generated using the diffstat utility.</p>
<pre>
.version | 2
ChangeLog | 6
asterisk-1.4.41-summary.html | 257 ----------------------------
asterisk-1.4.41-summary.txt | 384 -------------------------------------------
channels/chan_iax2.c | 14 +
res/res_features.c | 15 +
6 files changed, 32 insertions(+), 646 deletions(-)
</pre><br/>
<hr/>
</body>
</html>

View File

@@ -0,0 +1,92 @@
Release Summary
asterisk-1.4.41.1
Date: 2011-06-23
<asteriskteam@digium.com>
----------------------------------------------------------------------
Table of Contents
1. Summary
2. Contributors
3. Other Changes
4. Diffstat
----------------------------------------------------------------------
Summary
[Back to Top]
This release has been made to address one or more security vulnerabilities
that have been identified. A security advisory document has been published
for each vulnerability that includes additional information. Users of
versions of Asterisk that are affected are strongly encouraged to review
the advisories and determine what action they should take to protect their
systems from these issues.
Security Advisories: AST-2011-010
The data in this summary reflects changes that have been made since the
previous release, asterisk-1.4.41.
----------------------------------------------------------------------
Contributors
[Back to Top]
This table lists the people who have submitted code, those that have
tested patches, as well as those that reported issues on the issue tracker
that were resolved in this release. For coders, the number is how many of
their patches (of any size) were committed into this release. For testers,
the number is the number of times their name was listed as assisting with
testing a patch. Finally, for reporters, the number is the number of
issues that they reported that were closed by commits that went into this
release.
Coders Testers Reporters
2 lmadsen
----------------------------------------------------------------------
Commits Not Associated with an Issue
[Back to Top]
This is a list of all changes that went into this release that did not
directly close an issue from the issue tracker. The commits may have been
marked as being related to an issue. If that is the case, the issue
numbers are listed here, as well.
+------------------------------------------------------------------------+
| Revision | Author | Summary | Issues Referenced |
|----------+---------+-------------------------------+-------------------|
| 324626 | lmadsen | Create Asterisk 1.4.41.1 from | |
| | | 1.4.41 | |
|----------+---------+-------------------------------+-------------------|
| 324702 | lmadsen | Commit changes per | |
| | | AST-2011-010 | |
+------------------------------------------------------------------------+
----------------------------------------------------------------------
Diffstat Results
[Back to Top]
This is a summary of the changes to the source code that went into this
release that was generated using the diffstat utility.
.version | 2
ChangeLog | 6
asterisk-1.4.41-summary.html | 257 ----------------------------
asterisk-1.4.41-summary.txt | 384 -------------------------------------------
channels/chan_iax2.c | 14 +
res/res_features.c | 15 +
6 files changed, 32 insertions(+), 646 deletions(-)
----------------------------------------------------------------------

View File

@@ -4652,7 +4652,14 @@ static int iax2_setoption(struct ast_channel *c, int option, void *data, int dat
/* these two cannot be sent, because they require a result */
errno = ENOSYS;
return -1;
default:
/* These options are sent to the other side across the network where
* they will be passed to whatever channel is bridged there. Don't
* do anything silly like pass an option that transmits pointers to
* memory on this machine to a remote machine to use */
case AST_OPTION_TONE_VERIFY:
case AST_OPTION_TDD:
case AST_OPTION_RELAXDTMF:
case AST_OPTION_AUDIO_MODE:
{
unsigned short callno = PTR_TO_CALLNO(c->tech_pvt);
struct chan_iax2_pvt *pvt;
@@ -4680,7 +4687,12 @@ static int iax2_setoption(struct ast_channel *c, int option, void *data, int dat
free(h);
return res;
}
default:
return -1;
}
/* Just in case someone does a break instead of a return */
return -1;
}
static struct ast_frame *iax2_read(struct ast_channel *c)

View File

@@ -96,8 +96,13 @@ enum skinny_codecs {
#define DEFAULT_SKINNY_PORT 2000
#define DEFAULT_SKINNY_BACKLOG 2
#define SKINNY_MAX_PACKET 1000
#define DEFAULT_AUTH_TIMEOUT 30
#define DEFAULT_AUTH_LIMIT 50
static int keep_alive = 120;
static int auth_timeout = DEFAULT_AUTH_TIMEOUT;
static int auth_limit = DEFAULT_AUTH_LIMIT;
static int unauth_sessions = 0;
static char date_format[6] = "D-M-Y";
static char version_id[16] = "P002F202";
@@ -1060,6 +1065,7 @@ struct skinny_paging_device {
static struct skinnysession {
pthread_t t;
ast_mutex_t lock;
time_t start;
struct sockaddr_in sin;
int fd;
char inbuf[SKINNY_MAX_PACKET];
@@ -3064,6 +3070,7 @@ static int handle_register_message(struct skinny_req *req, struct skinnysession
transmit_response(s, req);
return 0;
}
ast_atomic_fetchadd_int(&unauth_sessions, -1);
if (option_verbose > 2)
ast_verbose(VERBOSE_PREFIX_3 "Device '%s' successfully registered\n", name);
@@ -4427,6 +4434,9 @@ static void destroy_session(struct skinnysession *s)
if (s->fd > -1) {
close(s->fd);
}
if (!s->device) {
ast_atomic_fetchadd_int(&unauth_sessions, -1);
}
ast_mutex_destroy(&s->lock);
free(s);
} else {
@@ -4439,13 +4449,30 @@ static int get_input(struct skinnysession *s)
{
int res;
int dlen = 0;
int timeout = keep_alive * 1100;
time_t now;
int *bufaddr;
struct pollfd fds[1];
if (!s->device) {
if(time(&now) == -1) {
ast_log(LOG_ERROR, "error executing time(): %s\n", strerror(errno));
return -1;
}
timeout = (auth_timeout - (now - s->start)) * 1000;
if (timeout < 0) {
/* we have timed out */
if (skinnydebug)
ast_verbose("Skinny Client failed to authenticate in %d seconds\n", auth_timeout);
return -1;
}
}
fds[0].fd = s->fd;
fds[0].events = POLLIN;
fds[0].revents = 0;
res = ast_poll(fds, 1, (keep_alive * 1100)); /* If nothing has happen, client is dead */
res = ast_poll(fds, 1, timeout); /* If nothing has happen, client is dead */
/* we add 10% to the keep_alive to deal */
/* with network delays, etc */
if (res < 0) {
@@ -4454,8 +4481,13 @@ static int get_input(struct skinnysession *s)
return res;
}
} else if (res == 0) {
if (skinnydebug)
ast_verbose("Skinny Client was lost, unregistering\n");
if (skinnydebug) {
if (s->device) {
ast_verbose("Skinny Client was lost, unregistering\n");
} else {
ast_verbose("Skinny Client failed to authenticate in %d seconds\n", auth_timeout);
}
}
skinny_unregister(NULL, s);
return -1;
}
@@ -4594,18 +4626,35 @@ static void *accept_thread(void *ignore)
ast_log(LOG_NOTICE, "Accept returned -1: %s\n", strerror(errno));
continue;
}
if (ast_atomic_fetchadd_int(&unauth_sessions, +1) >= auth_limit) {
close(as);
ast_atomic_fetchadd_int(&unauth_sessions, -1);
continue;
}
p = getprotobyname("tcp");
if(p) {
if( setsockopt(as, p->p_proto, TCP_NODELAY, (char *)&arg, sizeof(arg) ) < 0 ) {
ast_log(LOG_WARNING, "Failed to set Skinny tcp connection to TCP_NODELAY mode: %s\n", strerror(errno));
}
}
if (!(s = ast_calloc(1, sizeof(struct skinnysession))))
if (!(s = ast_calloc(1, sizeof(struct skinnysession)))) {
close(as);
ast_atomic_fetchadd_int(&unauth_sessions, -1);
continue;
}
memcpy(&s->sin, &sin, sizeof(sin));
ast_mutex_init(&s->lock);
s->fd = as;
if(time(&s->start) == -1) {
ast_log(LOG_ERROR, "error executing time(): %s; disconnecting client\n", strerror(errno));
destroy_session(s);
continue;
}
ast_mutex_lock(&sessionlock);
s->next = sessions;
sessions = s;
@@ -4756,6 +4805,24 @@ static int reload_config(void)
}
} else if (!strcasecmp(v->name, "keepalive")) {
keep_alive = atoi(v->value);
} else if (!strcasecmp(v->name, "authtimeout")) {
int timeout = atoi(v->value);
if (timeout < 1) {
ast_log(LOG_WARNING, "Invalid authtimeout value '%s', using default value\n", v->value);
auth_timeout = DEFAULT_AUTH_TIMEOUT;
} else {
auth_timeout = timeout;
}
} else if (!strcasecmp(v->name, "authlimit")) {
int limit = atoi(v->value);
if (limit < 1) {
ast_log(LOG_WARNING, "Invalid authlimit value '%s', using default value\n", v->value);
auth_limit = DEFAULT_AUTH_LIMIT;
} else {
auth_limit = limit;
}
} else if (!strcasecmp(v->name, "dateformat")) {
memcpy(date_format, v->value, sizeof(date_format));
} else if (!strcasecmp(v->name, "allow")) {

View File

@@ -26,7 +26,12 @@ bindport=8088
; requests must begin with /asterisk
;
;prefix=asterisk
;
; sessionlimit specifies the maximum number of httpsessions that will be
; allowed to exist at any given time. (default: 100)
;
;sessionlimit=100
;
; The post_mappings section maps URLs to real paths on the filesystem. If a
; POST is done from within an authenticated manager session to one of the
; configured POST mappings, then any files in the POST will be placed in the

View File

@@ -26,6 +26,17 @@ enabled = no
;webenabled = yes
port = 5038
; authtimeout specifies the maximum number of seconds a client has to
; authenticate. If the client does not authenticate beofre this timeout
; expires, the client will be disconnected. (default: 30 seconds)
;authtimeout = 30
; authlimit specifies the maximum number of unauthenticated sessions that will
; be allowed to connect at any given time.
;authlimit = 50
;httptimeout = 60
; a) httptimeout sets the Max-Age of the http cookie
; b) httptimeout is the amount of time the webserver waits

View File

@@ -9,6 +9,15 @@ dateformat=M-D-Y ; M,D,Y in any order (6 chars max)
; Use M for month, D for day, Y for year, A for 12-hour time.
keepalive=120
;authtimeout = 30 ; authtimeout specifies the maximum number of seconds a
; client has to authenticate. If the client does not
; authenticate beofre this timeout expires, the client
; will be disconnected. (default: 30 seconds)
;authlimit = 50 ; authlimit specifies the maximum number of
; unauthenticated sessions that will be allowed to
; connect at any given time. (default: 50)
;allow=all ; see doc/rtp-packetization for framing options
;disallow=

View File

@@ -60,6 +60,7 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
#define MAX_PREFIX 80
#define DEFAULT_PREFIX "/asterisk"
#define DEFAULT_SESSION_LIMIT 100
struct ast_http_server_instance {
FILE *f;
@@ -77,6 +78,8 @@ static char prefix[MAX_PREFIX];
static int prefix_len;
static struct sockaddr_in oldsin;
static int enablestatic;
static int session_limit = DEFAULT_SESSION_LIMIT;
static int session_count = 0;
/*! \brief Limit the kinds of files we're willing to serve up */
static struct {
@@ -516,6 +519,7 @@ static void *ast_httpd_helper_thread(void *data)
}
fclose(ser->f);
free(ser);
ast_atomic_fetchadd_int(&session_count, -1);
return NULL;
}
@@ -534,15 +538,23 @@ static void *http_root(void *data)
ast_wait_for_input(httpfd, -1);
sinlen = sizeof(sin);
fd = accept(httpfd, (struct sockaddr *)&sin, &sinlen);
if (fd < 0) {
if ((errno != EAGAIN) && (errno != EINTR))
ast_log(LOG_WARNING, "Accept failed: %s\n", strerror(errno));
continue;
}
if (ast_atomic_fetchadd_int(&session_count, +1) >= session_limit) {
close(fd);
continue;
}
ser = ast_calloc(1, sizeof(*ser));
if (!ser) {
ast_log(LOG_WARNING, "No memory for new session: %s\n", strerror(errno));
close(fd);
ast_atomic_fetchadd_int(&session_count, -1);
continue;
}
flags = fcntl(fd, F_GETFL);
@@ -557,12 +569,14 @@ static void *http_root(void *data)
ast_log(LOG_WARNING, "Unable to launch helper thread: %s\n", strerror(errno));
fclose(ser->f);
free(ser);
ast_atomic_fetchadd_int(&session_count, -1);
}
pthread_attr_destroy(&attr);
} else {
ast_log(LOG_WARNING, "fdopen failed!\n");
close(ser->fd);
free(ser);
ast_atomic_fetchadd_int(&session_count, -1);
}
}
return NULL;
@@ -679,8 +693,17 @@ static int __ast_http_load(int reload)
} else {
newprefix[0] = '\0';
}
} else if (!strcasecmp(v->name, "sessionlimit")) {
int limit = atoi(v->value);
if (limit < 1) {
ast_log(LOG_WARNING, "Invalid sessionlimit value '%s', using default value\n", v->value);
session_limit = DEFAULT_SESSION_LIMIT;
} else {
session_limit = limit;
}
}
v = v->next;
}
ast_config_destroy(cfg);

View File

@@ -104,6 +104,8 @@ static const int DEFAULT_DISPLAYCONNECTS = 1; /*!< Default setting for displayin
static const int DEFAULT_TIMESTAMPEVENTS = 0; /*!< Default setting for timestampevents */
static const int DEFAULT_HTTPTIMEOUT = 60; /*!< Default manager http timeout */
static const int DEFAULT_BROKENEVENTSACTION = 0; /*!< Default setting for brokeneventsaction */
static const int DEFAULT_AUTHTIMEOUT = 30; /*!< Default setting for authtimeout */
static const int DEFAULT_AUTHLIMIT = 50; /*!< Default setting for authlimit */
static int enabled;
@@ -113,10 +115,13 @@ static int displayconnects;
static int timestampevents;
static int httptimeout;
static int broken_events_action;
static int authtimeout;
static int authlimit;
static pthread_t t;
static int block_sockets;
static int num_sessions;
static int unauth_sessions = 0;
/* Protected by the sessions list lock */
struct eventqent *master_eventq = NULL;
@@ -222,6 +227,7 @@ struct mansession_session {
struct eventqent *eventq;
/* Timeout for ast_carefulwrite() */
int writetimeout;
time_t authstart;
int pending_event; /*!< Pending events indicator in case when waiting_thread is NULL */
AST_LIST_ENTRY(mansession_session) list;
};
@@ -2305,6 +2311,7 @@ static int process_message(struct mansession *s, const struct message *m)
return -1;
} else {
s->session->authenticated = 1;
ast_atomic_fetchadd_int(&unauth_sessions, -1);
if (option_verbose > 1) {
if (displayconnects) {
ast_verbose(VERBOSE_PREFIX_2 "%sManager '%s' logged on from %s\n",
@@ -2354,6 +2361,8 @@ static int get_input(struct mansession_session *s, char *output)
int res;
int x;
struct pollfd fds[1];
int timeout = -1;
time_t now;
for (x = 1; x < s->inlen; x++) {
if ((s->inbuf[x] == '\n') && (s->inbuf[x-1] == '\r')) {
/* Copy output data up to and including \r\n */
@@ -2372,7 +2381,22 @@ static int get_input(struct mansession_session *s, char *output)
}
fds[0].fd = s->fd;
fds[0].events = POLLIN;
do {
/* calculate a timeout if we are not authenticated */
if (!s->authenticated) {
if(time(&now) == -1) {
ast_log(LOG_ERROR, "error executing time(): %s\n", strerror(errno));
return -1;
}
timeout = (authtimeout - (now - s->authstart)) * 1000;
if (timeout < 0) {
/* we have timed out */
return 0;
}
}
ast_mutex_lock(&s->__lock);
if (s->pending_event) {
s->pending_event = 0;
@@ -2382,7 +2406,7 @@ static int get_input(struct mansession_session *s, char *output)
s->waiting_thread = pthread_self();
ast_mutex_unlock(&s->__lock);
res = ast_poll(fds, 1, -1);
res = ast_poll(fds, 1, timeout);
ast_mutex_lock(&s->__lock);
s->waiting_thread = AST_PTHREADT_NULL;
@@ -2400,6 +2424,9 @@ static int get_input(struct mansession_session *s, char *output)
if (res < 1)
return -1;
break;
} else {
/* timeout */
return 0;
}
} while(1);
s->inlen += res;
@@ -2412,6 +2439,7 @@ static int do_message(struct mansession *s)
struct message m = { 0 };
char header_buf[sizeof(s->session->inbuf)] = { '\0' };
int res;
time_t now;
for (;;) {
/* Check if any events are pending and do them if needed */
@@ -2421,6 +2449,17 @@ static int do_message(struct mansession *s)
}
res = get_input(s->session, header_buf);
if (res == 0) {
if (!s->session->authenticated) {
if(time(&now) == -1) {
ast_log(LOG_ERROR, "error executing time(): %s\n", strerror(errno));
return -1;
}
if (now - s->session->authstart > authtimeout) {
ast_log(LOG_EVENT, "Client from %s, failed to authenticate in %d seconds\n", ast_inet_ntoa(s->session->sin.sin_addr), authtimeout);
return -1;
}
}
continue;
} else if (res > 0) {
/* Strip trailing \r\n */
@@ -2455,6 +2494,7 @@ static void *session_do(void *data)
}
ast_log(LOG_EVENT, "Manager '%s' logged off from %s\n", session->username, ast_inet_ntoa(session->sin.sin_addr));
} else {
ast_atomic_fetchadd_int(&unauth_sessions, -1);
if (option_verbose > 1) {
if (displayconnects)
ast_verbose(VERBOSE_PREFIX_2 "Connect attempt from '%s' unable to authenticate\n", ast_inet_ntoa(session->sin.sin_addr));
@@ -2528,14 +2568,25 @@ static void *accept_thread(void *ignore)
ast_log(LOG_NOTICE, "Accept returned -1: %s\n", strerror(errno));
continue;
}
if (ast_atomic_fetchadd_int(&unauth_sessions, +1) >= authlimit) {
close(as);
ast_atomic_fetchadd_int(&unauth_sessions, -1);
ast_log(LOG_WARNING, "manager connection rejected, too many unauthenticated sessions.\n");
continue;
}
p = getprotobyname("tcp");
if (p) {
if( setsockopt(as, p->p_proto, TCP_NODELAY, (char *)&arg, sizeof(arg) ) < 0 ) {
ast_log(LOG_WARNING, "Failed to set manager tcp connection to TCP_NODELAY mode: %s\n", strerror(errno));
}
}
if (!(s = ast_calloc(1, sizeof(*s))))
if (!(s = ast_calloc(1, sizeof(*s)))) {
close(as);
ast_atomic_fetchadd_int(&unauth_sessions, -1);
continue;
}
memcpy(&s->sin, &sin, sizeof(sin));
s->writetimeout = 100;
@@ -2562,8 +2613,16 @@ static void *accept_thread(void *ignore)
s->eventq = s->eventq->next;
ast_atomic_fetchadd_int(&s->eventq->usecount, 1);
AST_LIST_UNLOCK(&sessions);
if (ast_pthread_create_background(&t, &attr, session_do, s))
if(time(&s->authstart) == -1) {
ast_log(LOG_ERROR, "error executing time(): %s; disconnecting client\n", strerror(errno));
ast_atomic_fetchadd_int(&unauth_sessions, -1);
destroy_session(s);
continue;
}
if (ast_pthread_create_background(&t, &attr, session_do, s)) {
ast_atomic_fetchadd_int(&unauth_sessions, -1);
destroy_session(s);
}
}
pthread_attr_destroy(&attr);
return NULL;
@@ -3100,6 +3159,8 @@ int init_manager(void)
block_sockets = DEFAULT_BLOCKSOCKETS;
timestampevents = DEFAULT_TIMESTAMPEVENTS;
httptimeout = DEFAULT_HTTPTIMEOUT;
authtimeout = DEFAULT_AUTHTIMEOUT;
authlimit = DEFAULT_AUTHLIMIT;
cfg = ast_config_load("manager.conf");
if (!cfg) {
@@ -3137,6 +3198,26 @@ int init_manager(void)
if ((val = ast_variable_retrieve(cfg, "general", "httptimeout")))
newhttptimeout = atoi(val);
if ((val = ast_variable_retrieve(cfg, "general", "authtimeout"))) {
int timeout = atoi(val);
if (timeout < 1) {
ast_log(LOG_WARNING, "Invalid authtimeout value '%s', using default value\n", val);
} else {
authtimeout = timeout;
}
}
if ((val = ast_variable_retrieve(cfg, "general", "authlimit"))) {
int limit = atoi(val);
if (limit < 1) {
ast_log(LOG_WARNING, "Invalid authlimit value '%s', using default value\n", val);
} else {
authlimit = limit;
}
}
memset(&ba, 0, sizeof(ba));
ba.sin_family = AF_INET;
ba.sin_port = htons(portno);

View File

@@ -2331,10 +2331,19 @@ int ast_bridge_call(struct ast_channel *chan,struct ast_channel *peer,struct ast
break;
case AST_CONTROL_OPTION:
aoh = f->data;
/* Forward option Requests */
/* Forward option Requests, but only ones we know are safe
* These are ONLY sent by chan_iax2 and I'm not convinced that
* they are useful. I haven't deleted them entirely because I
* just am not sure of the ramifications of removing them. */
if (aoh && aoh->flag == AST_OPTION_FLAG_REQUEST) {
ast_channel_setoption(other, ntohs(aoh->option), aoh->data,
f->datalen - sizeof(struct ast_option_header), 0);
switch (ntohs(aoh->option)) {
case AST_OPTION_TONE_VERIFY:
case AST_OPTION_TDD:
case AST_OPTION_RELAXDTMF:
case AST_OPTION_AUDIO_MODE:
ast_channel_setoption(other, ntohs(aoh->option), aoh->data,
f->datalen - sizeof(struct ast_option_header), 0);
}
}
break;
}