mirror of
https://github.com/asterisk/asterisk.git
synced 2025-08-21 05:03:51 +00:00
Compare commits
13 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
d69585a80e | ||
|
886f40576b | ||
|
cb07f2e861 | ||
|
9418c1ae89 | ||
|
d44cb3e5f7 | ||
|
6c86622761 | ||
|
5ba7d1d6d8 | ||
|
74f9372ac3 | ||
|
15929c9257 | ||
|
dce2e0b730 | ||
|
ed34cb861c | ||
|
1d99327eb4 | ||
|
16232b6f40 |
1
.lastclean
Normal file
1
.lastclean
Normal file
@@ -0,0 +1 @@
|
||||
33
|
62
asterisk-1.4.41.1-summary.html
Normal file
62
asterisk-1.4.41.1-summary.html
Normal 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"><asteriskteam@digium.com></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>
|
92
asterisk-1.4.41.1-summary.txt
Normal file
92
asterisk-1.4.41.1-summary.txt
Normal 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(-)
|
||||
|
||||
----------------------------------------------------------------------
|
@@ -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)
|
||||
|
@@ -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")) {
|
||||
|
@@ -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
|
||||
|
@@ -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
|
||||
|
@@ -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=
|
||||
|
||||
|
25
main/http.c
25
main/http.c
@@ -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);
|
||||
|
@@ -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);
|
||||
|
@@ -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;
|
||||
}
|
||||
|
Reference in New Issue
Block a user