aboutsummaryrefslogtreecommitdiffstats
path: root/main/asterisk
diff options
context:
space:
mode:
Diffstat (limited to 'main/asterisk')
-rw-r--r--main/asterisk/APKBUILD6
-rw-r--r--main/asterisk/ASTERISK-24517.patch405
2 files changed, 322 insertions, 89 deletions
diff --git a/main/asterisk/APKBUILD b/main/asterisk/APKBUILD
index cdbfb6c455..5a40015d35 100644
--- a/main/asterisk/APKBUILD
+++ b/main/asterisk/APKBUILD
@@ -2,7 +2,7 @@
# Contributor: Timo Teras <timo.teras@iki.fi>
# Maintainer: Timo Teras <timo.teras@iki.fi>
pkgname=asterisk
-pkgver=14.4.1
+pkgver=14.5.0
pkgrel=0
pkgdesc="Asterisk: A Module Open Source PBX System"
pkgusers="asterisk"
@@ -227,9 +227,9 @@ sound_en() {
chown -R asterisk:asterisk "$subpkgdir"/var/*/asterisk
}
-sha512sums="c28bfc50bba92bd5ebd497caf8c150d1ab5468cf012a858f0b5d65f92d37e444e93f94212e43fc8ede5d715af21af21477cd8adcf6487431fe65e294e543980d asterisk-14.4.1.tar.gz
+sha512sums="04dbea932900ecd3218629b2f19d20ad544cd7c02014fb4bd659e638e4a068ba179e6a4400bed788316fd337102ed8290c95823304567f378f9626361fd18c5e asterisk-14.5.0.tar.gz
aacef3f4796fb1abd33266998b53909cb4b36e7cc5ad2f7bac68bdc43e9a9072d9a4e2e7e681bddfa31f3d04575eb248afe6ea95da780c67e4829c1e22adfe1b asterisk-addon-mp3-r201.patch.gz
-0edbee56000b06aa1d3ea89f27559ca55d26bcdb714685d4fcc16ee0e5776b6946357e871fb80ffeeab5083303cfc5d29888f2fd326ee85a253092c0e5d10fe6 ASTERISK-24517.patch
+fedb0e422cd6acdff6a2ad60bebb174fcbac7a029b68b00116f64b2ecf3c0e577616174996b2fe22ed09061d3d6d917d8bf0b02ca9b6f3488b5958c99f127a6b ASTERISK-24517.patch
f72c2e04de80d3ed9ce841308101383a1655e6da7a3c888ad31fffe63d1280993e08aefcf8e638316d439c68b38ee05362c87503fca1f36343976a01af9d6eb1 musl-mutex-init.patch
935c25c7b1cdbd376056e20232a0e8c38dd32c344f50306d99930bf7cb37685c31329ead273b08ac9ab76daa9386adfb05b57440e46a39cb80e5542d65e8e3ed restore-multihomed-module.patch
cd5bd1c1d7db0a44b14eb10e6d098af0c6474c8fe1a57395090d6795ac00e9243d004b7d24eba2cfd5bd6d6407c271913e794551a8dfcf3cf93e89fc91349e12 asterisk.initd
diff --git a/main/asterisk/ASTERISK-24517.patch b/main/asterisk/ASTERISK-24517.patch
index 25d752a892..ad3116639c 100644
--- a/main/asterisk/ASTERISK-24517.patch
+++ b/main/asterisk/ASTERISK-24517.patch
@@ -1,4 +1,4 @@
-From 2dd17aa5306636e9b400590eb172cbc5bd87eb74 Mon Sep 17 00:00:00 2001
+From 6d511d7ff88ab6020dd5a5d5b02771fb3af9551a Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Timo=20Ter=C3=A4s?= <timo.teras@iki.fi>
Date: Thu, 2 Jun 2016 22:10:06 +0300
Subject: [PATCH] Implement internal abstraction for iostreams
@@ -16,20 +16,20 @@ ASTERISK-24517 #close
Change-Id: Id916aef418b665ced6a7489aef74908b6e376e85
---
- apps/app_externalivr.c | 119 ++++----
+ apps/app_externalivr.c | 119 ++++---
channels/chan_sip.c | 61 ++--
configure.ac | 4 -
- include/asterisk/iostream.h | 118 ++++++++
+ include/asterisk/iostream.h | 118 +++++++
include/asterisk/tcptls.h | 92 +-----
- main/http.c | 93 +++---
- main/iostream.c | 553 ++++++++++++++++++++++++++++++++++
- main/manager.c | 131 ++++----
- main/tcptls.c | 717 ++++++--------------------------------------
- main/utils.c | 68 -----
+ main/http.c | 109 ++-----
+ main/iostream.c | 553 ++++++++++++++++++++++++++++++++
+ main/manager.c | 137 ++++----
+ main/tcptls.c | 767 ++++++--------------------------------------
+ main/utils.c | 68 ----
res/res_http_post.c | 10 +-
- res/res_http_websocket.c | 116 ++++---
+ res/res_http_websocket.c | 116 +++----
res/res_phoneprov.c | 2 +-
- 13 files changed, 994 insertions(+), 1090 deletions(-)
+ 13 files changed, 993 insertions(+), 1163 deletions(-)
create mode 100644 include/asterisk/iostream.h
create mode 100644 main/iostream.c
@@ -255,7 +255,7 @@ index 2bb1d8b535..129f29b924 100644
static int unload_module(void)
diff --git a/channels/chan_sip.c b/channels/chan_sip.c
-index 86c4bea982..1691285227 100644
+index 5affee6ebc..50ab521f8d 100644
--- a/channels/chan_sip.c
+++ b/channels/chan_sip.c
@@ -2546,7 +2546,7 @@ static struct sip_threadinfo *sip_threadinfo_create(struct ast_tcptls_session_in
@@ -414,7 +414,7 @@ index 86c4bea982..1691285227 100644
cleanup:
if (tcptls_session && !tcptls_session->client && !authenticated) {
-@@ -29202,9 +29191,8 @@ static int sip_prepare_socket(struct sip_pvt *p)
+@@ -29229,9 +29218,8 @@ static int sip_prepare_socket(struct sip_pvt *p)
return s->fd;
}
if ((s->type & (AST_TRANSPORT_TCP | AST_TRANSPORT_TLS)) &&
@@ -426,7 +426,7 @@ index 86c4bea982..1691285227 100644
}
if ((s->type & (AST_TRANSPORT_WS | AST_TRANSPORT_WSS))) {
return s->ws_session ? ast_websocket_fd(s->ws_session) : -1;
-@@ -29234,7 +29222,7 @@ static int sip_prepare_socket(struct sip_pvt *p)
+@@ -29261,7 +29249,7 @@ static int sip_prepare_socket(struct sip_pvt *p)
/* 1. check for existing threads */
ast_sockaddr_copy(&sa_tmp, sip_real_dst(p));
if ((tcptls_session = sip_tcp_locate(&sa_tmp))) {
@@ -435,7 +435,7 @@ index 86c4bea982..1691285227 100644
if (s->tcptls_session) {
ao2_ref(s->tcptls_session, -1);
s->tcptls_session = NULL;
-@@ -29281,7 +29269,7 @@ static int sip_prepare_socket(struct sip_pvt *p)
+@@ -29319,7 +29307,7 @@ static int sip_prepare_socket(struct sip_pvt *p)
goto create_tcptls_session_fail;
}
@@ -444,7 +444,7 @@ index 86c4bea982..1691285227 100644
/* client connections need to have the sip_threadinfo object created before
* the thread is detached. This ensures the alert_pipe is up before it will
-@@ -30083,8 +30071,7 @@ static int sip_send_keepalive(const void *data)
+@@ -30121,8 +30109,7 @@ static int sip_send_keepalive(const void *data)
if ((peer->socket.fd != -1) && (peer->socket.type == AST_TRANSPORT_UDP)) {
res = ast_sendto(peer->socket.fd, keepalive, sizeof(keepalive), 0, &peer->addr);
} else if ((peer->socket.type & (AST_TRANSPORT_TCP | AST_TRANSPORT_TLS)) &&
@@ -455,10 +455,10 @@ index 86c4bea982..1691285227 100644
} else if (peer->socket.type == AST_TRANSPORT_UDP) {
res = ast_sendto(sipsock, keepalive, sizeof(keepalive), 0, &peer->addr);
diff --git a/configure.ac b/configure.ac
-index bc54de7591..e0b0b85ec5 100644
+index 4c6c0f21b3..b2d678cc67 100644
--- a/configure.ac
+++ b/configure.ac
-@@ -822,10 +822,6 @@ AC_ARG_ENABLE([asteriskssl],
+@@ -823,10 +823,6 @@ AC_ARG_ENABLE([asteriskssl],
esac], [AST_ASTERISKSSL=yes])
AC_SUBST(AST_ASTERISKSSL)
@@ -724,7 +724,7 @@ index d19ec529a9..1e3a7524bf 100644
-
#endif /* _ASTERISK_TCPTLS_H */
diff --git a/main/http.c b/main/http.c
-index 7565523deb..74dfdb9ef6 100644
+index 907f10223b..7a61249114 100644
--- a/main/http.c
+++ b/main/http.c
@@ -451,11 +451,13 @@ void ast_http_send(struct ast_tcptls_session_instance *ser,
@@ -751,10 +751,14 @@ index 7565523deb..74dfdb9ef6 100644
"HTTP/1.1 %d %s\r\n"
"%s"
"Date: %s\r\n"
-@@ -526,18 +528,16 @@ void ast_http_send(struct ast_tcptls_session_instance *ser,
+@@ -526,26 +528,16 @@ void ast_http_send(struct ast_tcptls_session_instance *ser,
/* send content */
if (method != AST_HTTP_HEAD || status_code >= 400) {
if (out && ast_str_strlen(out)) {
+- /*
+- * NOTE: Because ser->f is a non-standard FILE *, fwrite() will probably not
+- * behave exactly as documented.
+- */
- if (fwrite(ast_str_buffer(out), ast_str_strlen(out), 1, ser->f) != 1) {
+ len = ast_str_strlen(out);
+ if (ast_iostream_write(ser->stream, ast_str_buffer(out), len) != len) {
@@ -768,12 +772,16 @@ index 7565523deb..74dfdb9ef6 100644
- int len;
-
while ((len = read(fd, buf, sizeof(buf))) > 0) {
+- /*
+- * NOTE: Because ser->f is a non-standard FILE *, fwrite() will probably not
+- * behave exactly as documented.
+- */
- if (fwrite(buf, len, 1, ser->f) != 1) {
+ if (ast_iostream_write(ser->stream, buf, len) != len) {
ast_log(LOG_WARNING, "fwrite() failed: %s\n", strerror(errno));
close_connection = 1;
break;
-@@ -569,7 +569,7 @@ void ast_http_create_response(struct ast_tcptls_session_instance *ser, int statu
+@@ -577,7 +569,7 @@ void ast_http_create_response(struct ast_tcptls_session_instance *ser, int statu
ast_free(http_header_data);
ast_free(server_address);
ast_free(out);
@@ -782,10 +790,15 @@ index 7565523deb..74dfdb9ef6 100644
ast_debug(1, "HTTP closing session. OOM.\n");
ast_tcptls_close_session_file(ser);
}
-@@ -923,9 +923,9 @@ static int http_body_read_contents(struct ast_tcptls_session_instance *ser, char
+@@ -931,14 +923,9 @@ static int http_body_read_contents(struct ast_tcptls_session_instance *ser, char
{
int res;
+- /*
+- * NOTE: Because ser->f is a non-standard FILE *, fread() does not behave as
+- * documented.
+- */
+-
- /* Stay in fread until get all the expected data or timeout. */
- res = fread(buf, length, 1, ser->f);
- if (res < 1) {
@@ -795,13 +808,19 @@ index 7565523deb..74dfdb9ef6 100644
ast_log(LOG_WARNING, "Short HTTP request %s (Wanted %d)\n",
what_getting, length);
return -1;
-@@ -947,23 +947,12 @@ static int http_body_read_contents(struct ast_tcptls_session_instance *ser, char
+@@ -960,28 +947,12 @@ static int http_body_read_contents(struct ast_tcptls_session_instance *ser, char
*/
static int http_body_discard_contents(struct ast_tcptls_session_instance *ser, int length, const char *what_getting)
{
- int res;
- char buf[MAX_HTTP_LINE_LENGTH];/* Discard buffer */
-
+- /*
+- * NOTE: Because ser->f is a non-standard FILE *, fread() does not behave as
+- * documented.
+- */
++ ssize_t res;
+
- /* Stay in fread until get all the expected data or timeout. */
- while (sizeof(buf) < length) {
- res = fread(buf, sizeof(buf), 1, ser->f);
@@ -816,8 +835,6 @@ index 7565523deb..74dfdb9ef6 100644
- if (res < 1) {
- ast_log(LOG_WARNING, "Short HTTP request %s (Wanted %d of remaining %d)\n",
- what_getting, length, length);
-+ ssize_t res;
-+
+ res = ast_iostream_discard(ser->stream, length);
+ if (res < length) {
+ ast_log(LOG_WARNING, "Short HTTP request %s (Wanted %d but got %zd)\n",
@@ -825,7 +842,7 @@ index 7565523deb..74dfdb9ef6 100644
return -1;
}
return 0;
-@@ -1039,7 +1028,7 @@ static int http_body_get_chunk_length(struct ast_tcptls_session_instance *ser)
+@@ -1057,7 +1028,7 @@ static int http_body_get_chunk_length(struct ast_tcptls_session_instance *ser)
char header_line[MAX_HTTP_LINE_LENGTH];
/* get the line of hexadecimal giving chunk-size w/ optional chunk-extension */
@@ -834,8 +851,8 @@ index 7565523deb..74dfdb9ef6 100644
ast_log(LOG_WARNING, "Short HTTP read of chunked header\n");
return -1;
}
-@@ -1067,8 +1056,8 @@ static int http_body_check_chunk_sync(struct ast_tcptls_session_instance *ser)
- char chunk_sync[2];
+@@ -1090,8 +1061,8 @@ static int http_body_check_chunk_sync(struct ast_tcptls_session_instance *ser)
+ */
/* Stay in fread until get the expected CRLF or timeout. */
- res = fread(chunk_sync, sizeof(chunk_sync), 1, ser->f);
@@ -845,7 +862,7 @@ index 7565523deb..74dfdb9ef6 100644
ast_log(LOG_WARNING, "Short HTTP chunk sync read (Wanted %zu)\n",
sizeof(chunk_sync));
return -1;
-@@ -1097,7 +1086,7 @@ static int http_body_discard_chunk_trailer_headers(struct ast_tcptls_session_ins
+@@ -1120,7 +1091,7 @@ static int http_body_discard_chunk_trailer_headers(struct ast_tcptls_session_ins
char header_line[MAX_HTTP_LINE_LENGTH];
for (;;) {
@@ -854,7 +871,7 @@ index 7565523deb..74dfdb9ef6 100644
ast_log(LOG_WARNING, "Short HTTP read of chunked trailer header\n");
return -1;
}
-@@ -1760,7 +1749,7 @@ static int http_request_headers_get(struct ast_tcptls_session_instance *ser, str
+@@ -1783,7 +1754,7 @@ static int http_request_headers_get(struct ast_tcptls_session_instance *ser, str
char *name;
char *value;
@@ -863,7 +880,7 @@ index 7565523deb..74dfdb9ef6 100644
ast_http_error(ser, 400, "Bad Request", "Timeout");
return -1;
}
-@@ -1834,7 +1823,7 @@ static int httpd_process_request(struct ast_tcptls_session_instance *ser)
+@@ -1857,7 +1828,7 @@ static int httpd_process_request(struct ast_tcptls_session_instance *ser)
int res;
char request_line[MAX_HTTP_LINE_LENGTH];
@@ -872,7 +889,7 @@ index 7565523deb..74dfdb9ef6 100644
return -1;
}
-@@ -1918,7 +1907,7 @@ static void *httpd_helper_thread(void *data)
+@@ -1941,7 +1912,7 @@ static void *httpd_helper_thread(void *data)
int flags = 1;
int timeout;
@@ -881,7 +898,7 @@ index 7565523deb..74dfdb9ef6 100644
ao2_cleanup(ser);
return NULL;
}
-@@ -1935,14 +1924,11 @@ static void *httpd_helper_thread(void *data)
+@@ -1958,14 +1929,11 @@ static void *httpd_helper_thread(void *data)
* This is necessary to prevent delays (caused by buffering) as we
* write to the socket in bits and pieces.
*/
@@ -899,7 +916,7 @@ index 7565523deb..74dfdb9ef6 100644
/* Setup HTTP worker private data to keep track of request body reading. */
ao2_cleanup(ser->private_data);
-@@ -1965,23 +1951,17 @@ static void *httpd_helper_thread(void *data)
+@@ -1988,23 +1956,17 @@ static void *httpd_helper_thread(void *data)
}
/* We can let the stream wait for data to arrive. */
@@ -929,7 +946,7 @@ index 7565523deb..74dfdb9ef6 100644
break;
}
-@@ -1995,10 +1975,9 @@ static void *httpd_helper_thread(void *data)
+@@ -2018,10 +1980,9 @@ static void *httpd_helper_thread(void *data)
done:
ast_atomic_fetchadd_int(&session_count, -1);
@@ -1503,7 +1520,7 @@ index 0000000000..46abc18a5c
+#endif
+}
diff --git a/main/manager.c b/main/manager.c
-index c7f4092ac0..e7067f5c07 100644
+index 6604f6f2bf..9d67f5e47b 100644
--- a/main/manager.c
+++ b/main/manager.c
@@ -1551,8 +1551,7 @@ static void acl_change_stasis_unsubscribe(void)
@@ -1629,16 +1646,22 @@ index c7f4092ac0..e7067f5c07 100644
ao2_lock(s->session);
s->session->waiting_thread = AST_PTHREADT_NULL;
-@@ -6500,7 +6496,7 @@ static int get_input(struct mansession *s, char *output)
+@@ -6500,13 +6496,7 @@ static int get_input(struct mansession *s, char *output)
}
ao2_lock(s->session);
+- /*
+- * It is worth noting here that you can all but ignore fread()'s documentation
+- * for the purposes of this call. The FILE * we are working with here was created
+- * as a result of a call to fopencookie() (or equivalent) in tcptls.c, and as such
+- * the behavior of fread() is not as documented. Frankly, I think this is gross.
+- */
- res = fread(src + s->session->inlen, 1, maxlen - s->session->inlen, s->session->f);
+ res = ast_iostream_read(s->session->stream, src + s->session->inlen, maxlen - s->session->inlen);
if (res < 1) {
res = -1; /* error return */
} else {
-@@ -6638,7 +6634,7 @@ static void *session_do(void *data)
+@@ -6644,7 +6634,7 @@ static void *session_do(void *data)
struct ast_sockaddr ser_remote_address_tmp;
if (ast_atomic_fetchadd_int(&unauth_sessions, +1) >= authlimit) {
@@ -1647,7 +1670,7 @@ index c7f4092ac0..e7067f5c07 100644
ast_atomic_fetchadd_int(&unauth_sessions, -1);
goto done;
}
-@@ -6647,7 +6643,7 @@ static void *session_do(void *data)
+@@ -6653,7 +6643,7 @@ static void *session_do(void *data)
session = build_mansession(&ser_remote_address_tmp);
if (session == NULL) {
@@ -1656,7 +1679,7 @@ index c7f4092ac0..e7067f5c07 100644
ast_atomic_fetchadd_int(&unauth_sessions, -1);
goto done;
}
-@@ -6655,14 +6651,10 @@ static void *session_do(void *data)
+@@ -6661,14 +6651,10 @@ static void *session_do(void *data)
/* here we set TCP_NODELAY on the socket to disable Nagle's algorithm.
* This is necessary to prevent delays (caused by buffering) as we
* write to the socket in bits and pieces. */
@@ -1673,7 +1696,7 @@ index c7f4092ac0..e7067f5c07 100644
ao2_lock(session);
/* Hook to the tail of the event queue */
-@@ -6671,8 +6663,7 @@ static void *session_do(void *data)
+@@ -6677,8 +6663,7 @@ static void *session_do(void *data)
ast_mutex_init(&s.lock);
/* these fields duplicate those in the 'ser' structure */
@@ -1683,7 +1706,7 @@ index c7f4092ac0..e7067f5c07 100644
ast_sockaddr_copy(&session->addr, &ser_remote_address_tmp);
s.session = session;
-@@ -6691,9 +6682,9 @@ static void *session_do(void *data)
+@@ -6697,9 +6682,9 @@ static void *session_do(void *data)
* We cannot let the stream exclusively wait for data to arrive.
* We have to wake up the task to send async events.
*/
@@ -1695,7 +1718,7 @@ index c7f4092ac0..e7067f5c07 100644
ast_tvnow(), authtimeout * 1000);
astman_append(&s, "Asterisk Call Manager/%s\r\n", AMI_VERSION); /* welcome prompt */
-@@ -6702,7 +6693,7 @@ static void *session_do(void *data)
+@@ -6708,7 +6693,7 @@ static void *session_do(void *data)
break;
}
if (session->authenticated) {
@@ -1704,7 +1727,7 @@ index c7f4092ac0..e7067f5c07 100644
}
}
/* session is over, explain why and terminate */
-@@ -7562,23 +7553,9 @@ static void xml_translate(struct ast_str **out, char *in, struct ast_variable *g
+@@ -7568,23 +7553,9 @@ static void xml_translate(struct ast_str **out, char *in, struct ast_variable *g
static void close_mansession_file(struct mansession *s)
{
@@ -1731,7 +1754,7 @@ index c7f4092ac0..e7067f5c07 100644
} else {
ast_log(LOG_ERROR, "Attempted to close file/file descriptor on mansession without a valid file or file descriptor.\n");
}
-@@ -7587,17 +7564,20 @@ static void close_mansession_file(struct mansession *s)
+@@ -7593,17 +7564,20 @@ static void close_mansession_file(struct mansession *s)
static void process_output(struct mansession *s, struct ast_str **out, struct ast_variable *params, enum output_format format)
{
char *buf;
@@ -1747,18 +1770,18 @@ index c7f4092ac0..e7067f5c07 100644
- fprintf(s->f, "%c", 0);
- fflush(s->f);
+ ast_iostream_write(s->stream, "", 1);
++
++ fd = ast_iostream_get_fd(s->stream);
- if ((l = ftell(s->f)) > 0) {
- if (MAP_FAILED == (buf = mmap(NULL, l, PROT_READ | PROT_WRITE, MAP_PRIVATE, s->fd, 0))) {
-+ fd = ast_iostream_get_fd(s->stream);
-+
+ l = lseek(fd, SEEK_CUR, 0);
+ if (l > 0) {
+ if (MAP_FAILED == (buf = mmap(NULL, l, PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, 0))) {
ast_log(LOG_WARNING, "mmap failed. Manager output was not processed\n");
} else {
if (format == FORMAT_XML || format == FORMAT_HTML) {
-@@ -7624,6 +7604,7 @@ static int generic_http_callback(struct ast_tcptls_session_instance *ser,
+@@ -7630,6 +7604,7 @@ static int generic_http_callback(struct ast_tcptls_session_instance *ser,
struct mansession s = { .session = NULL, .tcptls_session = ser };
struct mansession_session *session = NULL;
uint32_t ident;
@@ -1766,7 +1789,7 @@ index c7f4092ac0..e7067f5c07 100644
int blastaway = 0;
struct ast_variable *v;
struct ast_variable *params = get_params;
-@@ -7679,17 +7660,17 @@ static int generic_http_callback(struct ast_tcptls_session_instance *ser,
+@@ -7685,17 +7660,17 @@ static int generic_http_callback(struct ast_tcptls_session_instance *ser,
}
s.session = session;
@@ -1789,7 +1812,7 @@ index c7f4092ac0..e7067f5c07 100644
goto generic_callback_out;
}
-@@ -7829,9 +7810,9 @@ generic_callback_out:
+@@ -7835,9 +7810,9 @@ generic_callback_out:
if (blastaway) {
session_destroy(session);
} else {
@@ -1802,7 +1825,7 @@ index c7f4092ac0..e7067f5c07 100644
}
unref_mansession(session);
}
-@@ -7856,6 +7837,7 @@ static int auth_http_callback(struct ast_tcptls_session_instance *ser,
+@@ -7862,6 +7837,7 @@ static int auth_http_callback(struct ast_tcptls_session_instance *ser,
struct message m = { 0 };
unsigned int idx;
size_t hdrlen;
@@ -1810,7 +1833,7 @@ index c7f4092ac0..e7067f5c07 100644
time_t time_now = time(NULL);
unsigned long nonce = 0, nc;
-@@ -8034,17 +8016,17 @@ static int auth_http_callback(struct ast_tcptls_session_instance *ser,
+@@ -8040,17 +8016,17 @@ static int auth_http_callback(struct ast_tcptls_session_instance *ser,
ast_mutex_init(&s.lock);
s.session = session;
@@ -1833,7 +1856,7 @@ index c7f4092ac0..e7067f5c07 100644
goto auth_callback_out;
}
-@@ -8095,7 +8077,7 @@ static int auth_http_callback(struct ast_tcptls_session_instance *ser,
+@@ -8101,7 +8077,7 @@ static int auth_http_callback(struct ast_tcptls_session_instance *ser,
m.headers[idx] = NULL;
}
@@ -1842,7 +1865,7 @@ index c7f4092ac0..e7067f5c07 100644
http_header = ast_str_create(80);
out = ast_str_create(result_size * 2 + 512);
-@@ -8147,11 +8129,10 @@ auth_callback_out:
+@@ -8153,11 +8129,10 @@ auth_callback_out:
ast_free(out);
ao2_lock(session);
@@ -1858,10 +1881,10 @@ index c7f4092ac0..e7067f5c07 100644
if (session->needdestroy) {
diff --git a/main/tcptls.c b/main/tcptls.c
-index 5abaa4cb99..86bb262469 100644
+index 1f99d7b923..ca9a447868 100644
--- a/main/tcptls.c
+++ b/main/tcptls.c
-@@ -51,512 +51,13 @@ ASTERISK_REGISTER_FILE()
+@@ -51,559 +51,13 @@ ASTERISK_REGISTER_FILE()
#include "asterisk/pbx.h"
#include "asterisk/app.h"
@@ -1896,6 +1919,39 @@ index 5abaa4cb99..86bb262469 100644
- int exclusive_input;
-};
-
+-#if defined(DO_SSL)
+-AST_THREADSTORAGE(err2str_threadbuf);
+-#define ERR2STR_BUFSIZE 128
+-
+-static const char *ssl_error_to_string(int sslerr, int ret)
+-{
+- switch (sslerr) {
+- case SSL_ERROR_SSL:
+- return "Internal SSL error";
+- case SSL_ERROR_SYSCALL:
+- if (!ret) {
+- return "System call EOF";
+- } else if (ret == -1) {
+- char *buf;
+-
+- buf = ast_threadstorage_get(&err2str_threadbuf, ERR2STR_BUFSIZE);
+- if (!buf) {
+- return "Unknown";
+- }
+-
+- snprintf(buf, ERR2STR_BUFSIZE, "Underlying BIO error: %s", strerror(errno));
+- return buf;
+- } else {
+- return "System call other";
+- }
+- default:
+- break;
+- }
+-
+- return "Unknown";
+-}
+-#endif
+-
-void ast_tcptls_stream_set_timeout_disable(struct ast_tcptls_stream *stream)
-{
- ast_assert(stream != NULL);
@@ -1964,12 +2020,17 @@ index 5abaa4cb99..86bb262469 100644
-#if defined(DO_SSL)
- if (stream->ssl) {
- for (;;) {
+- int sslerr;
+- char err[256];
+-
- res = SSL_read(stream->ssl, buf, size);
- if (0 < res) {
- /* We read some payload data. */
- return res;
- }
-- switch (SSL_get_error(stream->ssl, res)) {
+-
+- sslerr = SSL_get_error(stream->ssl, res);
+- switch (sslerr) {
- case SSL_ERROR_ZERO_RETURN:
- /* Report EOF for a shutdown */
- ast_debug(1, "TLS clean shutdown alert reading data\n");
@@ -2017,7 +2078,8 @@ index 5abaa4cb99..86bb262469 100644
- break;
- default:
- /* Report EOF for an undecoded SSL or transport error. */
-- ast_debug(1, "TLS transport or SSL error reading data\n");
+- ast_debug(1, "TLS transport or SSL error reading data: %s, %s\n", ERR_error_string(sslerr, err),
+- ssl_error_to_string(sslerr, res));
- return 0;
- }
- if (!ms) {
@@ -2092,6 +2154,9 @@ index 5abaa4cb99..86bb262469 100644
- written = 0;
- remaining = size;
- for (;;) {
+- int sslerr;
+- char err[256];
+-
- res = SSL_write(stream->ssl, buf + written, remaining);
- if (res == remaining) {
- /* Everything was written. */
@@ -2103,7 +2168,8 @@ index 5abaa4cb99..86bb262469 100644
- remaining -= res;
- continue;
- }
-- switch (SSL_get_error(stream->ssl, res)) {
+- sslerr = SSL_get_error(stream->ssl, res);
+- switch (sslerr) {
- case SSL_ERROR_ZERO_RETURN:
- ast_debug(1, "TLS clean shutdown alert writing data\n");
- if (written) {
@@ -2132,7 +2198,8 @@ index 5abaa4cb99..86bb262469 100644
- break;
- default:
- /* Undecoded SSL or transport error. */
-- ast_debug(1, "TLS transport or SSL error writing data\n");
+- ast_debug(1, "TLS transport or SSL error writing data: %s, %s\n", ERR_error_string(sslerr, err),
+- ssl_error_to_string(sslerr, res));
- if (written) {
- /* Report partial write. */
- return written;
@@ -2209,8 +2276,11 @@ index 5abaa4cb99..86bb262469 100644
- */
- res = SSL_shutdown(stream->ssl);
- if (res < 0) {
-- ast_log(LOG_ERROR, "SSL_shutdown() failed: %d\n",
-- SSL_get_error(stream->ssl, res));
+- int sslerr = SSL_get_error(stream->ssl, res);
+- char err[256];
+-
+- ast_log(LOG_ERROR, "SSL_shutdown() failed: %s, %s\n",
+- ERR_error_string(sslerr, err), ssl_error_to_string(sslerr, res));
- }
-
-#if defined(OPENSSL_VERSION_NUMBER) && OPENSSL_VERSION_NUMBER >= 0x10100000L
@@ -2377,18 +2447,17 @@ index 5abaa4cb99..86bb262469 100644
}
ast_free(i->overflow_buf);
ao2_cleanup(i->private_data);
-@@ -601,9 +102,7 @@ static void *handle_tcptls_connection(void *data)
+@@ -649,8 +103,7 @@ static void *handle_tcptls_connection(void *data)
{
struct ast_tcptls_session_instance *tcptls_session = data;
#ifdef DO_SSL
- int (*ssl_setup)(SSL *) = (tcptls_session->client) ? SSL_connect : SSL_accept;
- int ret;
-- char err[256];
+ SSL *ssl;
#endif
/* TCP/TLS connections are associated with external protocols, and
-@@ -618,123 +117,94 @@ static void *handle_tcptls_connection(void *data)
+@@ -665,127 +118,94 @@ static void *handle_tcptls_connection(void *data)
return NULL;
}
@@ -2432,7 +2501,11 @@ index 5abaa4cb99..86bb262469 100644
- else if ( (tcptls_session->ssl = SSL_new(tcptls_session->parent->tls_cfg->ssl_ctx)) ) {
- SSL_set_fd(tcptls_session->ssl, tcptls_session->fd);
- if ((ret = ssl_setup(tcptls_session->ssl)) <= 0) {
-- ast_log(LOG_ERROR, "Problem setting up ssl connection: %s\n", ERR_error_string(ERR_get_error(), err));
+- char err[256];
+- int sslerr = SSL_get_error(tcptls_session->ssl, ret);
+-
+- ast_log(LOG_ERROR, "Problem setting up ssl connection: %s, %s\n", ERR_error_string(sslerr, err),
+- ssl_error_to_string(sslerr, ret));
- } else if ((tcptls_session->f = tcptls_stream_fopen(tcptls_session->stream_cookie,
- tcptls_session->ssl, tcptls_session->fd, -1))) {
- if ((tcptls_session->client && !ast_test_flag(&tcptls_session->parent->tls_cfg->flags, AST_SSL_DONT_VERIFY_SERVER))
@@ -2446,7 +2519,7 @@ index 5abaa4cb99..86bb262469 100644
- ao2_ref(tcptls_session, -1);
- return NULL;
- }
-
+-
- res = SSL_get_verify_result(tcptls_session->ssl);
- if (res != X509_V_OK) {
- ast_log(LOG_ERROR, "Certificate did not verify: %s\n", X509_verify_cert_error_string(res));
@@ -2469,7 +2542,7 @@ index 5abaa4cb99..86bb262469 100644
- if (pos < 0) {
- break;
- }
--
+
- str = X509_NAME_ENTRY_get_data(X509_NAME_get_entry(name, pos));
- if (!check_tcptls_cert_name(str, tcptls_session->parent->hostname, "common name")) {
- found = 1;
@@ -2581,7 +2654,7 @@ index 5abaa4cb99..86bb262469 100644
}
if (tcptls_session->parent->worker_fn) {
-@@ -784,7 +254,13 @@ void *ast_tcptls_server_root(void *data)
+@@ -844,7 +264,13 @@ void *ast_tcptls_server_root(void *data)
}
flags = fcntl(fd, F_GETFL);
fcntl(fd, F_SETFL, flags & ~O_NONBLOCK);
@@ -2596,7 +2669,7 @@ index 5abaa4cb99..86bb262469 100644
tcptls_session->parent = desc;
ast_sockaddr_copy(&tcptls_session->remote_address, &addr);
-@@ -1052,7 +528,7 @@ client_start_error:
+@@ -1122,7 +548,7 @@ client_start_error:
struct ast_tcptls_session_instance *ast_tcptls_client_create(struct ast_tcptls_session_args *desc)
{
@@ -2605,7 +2678,7 @@ index 5abaa4cb99..86bb262469 100644
struct ast_tcptls_session_instance *tcptls_session = NULL;
/* Do nothing if nothing has changed */
-@@ -1068,8 +544,8 @@ struct ast_tcptls_session_instance *ast_tcptls_client_create(struct ast_tcptls_s
+@@ -1138,8 +564,8 @@ struct ast_tcptls_session_instance *ast_tcptls_client_create(struct ast_tcptls_s
close(desc->accept_fd);
}
@@ -2616,7 +2689,7 @@ index 5abaa4cb99..86bb262469 100644
if (desc->accept_fd < 0) {
ast_log(LOG_ERROR, "Unable to allocate socket for %s: %s\n",
desc->name, strerror(errno));
-@@ -1099,7 +575,11 @@ struct ast_tcptls_session_instance *ast_tcptls_client_create(struct ast_tcptls_s
+@@ -1169,7 +595,11 @@ struct ast_tcptls_session_instance *ast_tcptls_client_create(struct ast_tcptls_s
goto error;
}
tcptls_session->client = 1;
@@ -2629,7 +2702,7 @@ index 5abaa4cb99..86bb262469 100644
tcptls_session->parent = desc;
tcptls_session->parent->worker_fn = NULL;
ast_sockaddr_copy(&tcptls_session->remote_address,
-@@ -1259,24 +739,9 @@ error:
+@@ -1329,24 +759,9 @@ error:
void ast_tcptls_close_session_file(struct ast_tcptls_session_instance *tcptls_session)
{
@@ -2658,10 +2731,10 @@ index 5abaa4cb99..86bb262469 100644
ast_log(LOG_ERROR, "ast_tcptls_close_session_file invoked on session instance without file or file descriptor\n");
}
diff --git a/main/utils.c b/main/utils.c
-index 14d529cf44..c72fdac923 100644
+index cfe2e4c427..12aaf68094 100644
--- a/main/utils.c
+++ b/main/utils.c
-@@ -1429,74 +1429,6 @@ int ast_carefulwrite(int fd, char *s, int len, int timeoutms)
+@@ -1432,74 +1432,6 @@ int ast_carefulwrite(int fd, char *s, int len, int timeoutms)
return res;
}
@@ -2779,7 +2852,7 @@ index 37fc4fa091..907ee56fbd 100644
fclose(f);
ast_http_error(ser, 400, "Bad Request", "Cannot find boundary marker in POST request.");
diff --git a/res/res_http_websocket.c b/res/res_http_websocket.c
-index 8476e26312..ce6430ff1d 100644
+index 9f5d931d6a..5f59c2c8cb 100644
--- a/res/res_http_websocket.c
+++ b/res/res_http_websocket.c
@@ -88,8 +88,7 @@ ASTERISK_REGISTER_FILE()
@@ -3079,10 +3152,10 @@ index 2e4f873623..1b77b9f48b 100644
} else {
struct extension *exten_iter;
--
-2.12.2
+2.13.0
-From 4719882b6ab4bcfff54c36a2b4d48424b65d3a6f Mon Sep 17 00:00:00 2001
+From 68e88eb869144be992ff3eec77271fc3d55481e5 Mon Sep 17 00:00:00 2001
From: Joshua Colp <jcolp@digium.com>
Date: Mon, 28 Nov 2016 13:36:18 +0000
Subject: [PATCH] iostream: Move include of asterisk.h
@@ -3115,10 +3188,10 @@ index 46abc18a5c..008888142b 100644
#include "asterisk/astobj2.h"
#include "asterisk/iostream.h"
--
-2.12.2
+2.13.0
-From ce5b51c6366021d44b2aabc3c0ffd4e4c7d25b77 Mon Sep 17 00:00:00 2001
+From 16b1e62dd8ee8efba0dfe9ec561ff60914d0e3ff Mon Sep 17 00:00:00 2001
From: Mark Michelson <mmichelson@digium.com>
Date: Tue, 6 Dec 2016 10:56:06 -0600
Subject: [PATCH] Iostreams: Correct off-by-one error.
@@ -3181,10 +3254,10 @@ index 008888142b..9fa39cce59 100644
}
}
--
-2.12.2
+2.13.0
-From 942c9de5be6f36271acbddc661047095fecb7130 Mon Sep 17 00:00:00 2001
+From 229fe7f6026aaf41f35c06afaa836225e4f9577d Mon Sep 17 00:00:00 2001
From: Mark Michelson <mmichelson@digium.com>
Date: Thu, 1 Dec 2016 16:49:03 -0600
Subject: [PATCH] http: Send headers and body in one write.
@@ -3215,7 +3288,7 @@ Change-Id: Idc2d2fb3d9b3db14b8631a1e302244fa18b0e518
1 file changed, 12 insertions(+), 17 deletions(-)
diff --git a/main/http.c b/main/http.c
-index 74dfdb9ef6..c4c6747751 100644
+index 7a61249114..ddae0df2b7 100644
--- a/main/http.c
+++ b/main/http.c
@@ -456,6 +456,7 @@ void ast_http_send(struct ast_tcptls_session_instance *ser,
@@ -3279,10 +3352,10 @@ index 74dfdb9ef6..c4c6747751 100644
}
}
--
-2.12.2
+2.13.0
-From 926637ce05e5ad5d9f775049d03d133f84506a59 Mon Sep 17 00:00:00 2001
+From b1af0a7d5d4bc05fcf13cd535a5959dbe63bd49b Mon Sep 17 00:00:00 2001
From: Badalyan Vyacheslav <v.badalyan@open-bs.ru>
Date: Thu, 8 Dec 2016 18:34:28 +0000
Subject: [PATCH] Fix IO conversion bug
@@ -3296,7 +3369,7 @@ Change-Id: Id9f393ff25b009a6c4a6e40b95f561a9369e4585
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/res/res_http_websocket.c b/res/res_http_websocket.c
-index ce6430ff1d..80f965ec05 100644
+index 5f59c2c8cb..293685205f 100644
--- a/res/res_http_websocket.c
+++ b/res/res_http_websocket.c
@@ -492,7 +492,7 @@ const char * AST_OPTIONAL_API_NAME(ast_websocket_session_id)(struct ast_websocke
@@ -3309,5 +3382,165 @@ index ce6430ff1d..80f965ec05 100644
char *rbuf = buf;
int sanity = 10;
--
-2.12.2
+2.13.0
+
+
+From 42cca2dfae6bddd946ab07221328eafdcc6c7534 Mon Sep 17 00:00:00 2001
+From: Joshua Colp <jcolp@digium.com>
+Date: Tue, 9 May 2017 15:34:49 +0000
+Subject: [PATCH] tcptls: Improve error messages for TLS connections.
+
+This change uses the functions provided by OpenSSL to query
+and better construct error messages for situations where
+the connection encounters a problem.
+
+ASTERISK-26606
+
+Change-Id: I7ae40ce88c0dc4e185c4df1ceb3a6ccc198f075b
+---
+ main/iostream.c | 67 ++++++++++++++++++++++++++++++++++++++++++++++++---------
+ 1 file changed, 57 insertions(+), 10 deletions(-)
+
+diff --git a/main/iostream.c b/main/iostream.c
+index 9fa39cce59..1013c6d9b9 100644
+--- a/main/iostream.c
++++ b/main/iostream.c
+@@ -37,6 +37,39 @@ struct ast_iostream {
+ char rbuf[2048];
+ };
+
++#if defined(DO_SSL)
++AST_THREADSTORAGE(err2str_threadbuf);
++#define ERR2STR_BUFSIZE 128
++
++static const char *ssl_error_to_string(int sslerr, int ret)
++{
++ switch (sslerr) {
++ case SSL_ERROR_SSL:
++ return "Internal SSL error";
++ case SSL_ERROR_SYSCALL:
++ if (!ret) {
++ return "System call EOF";
++ } else if (ret == -1) {
++ char *buf;
++
++ buf = ast_threadstorage_get(&err2str_threadbuf, ERR2STR_BUFSIZE);
++ if (!buf) {
++ return "Unknown";
++ }
++
++ snprintf(buf, ERR2STR_BUFSIZE, "Underlying BIO error: %s", strerror(errno));
++ return buf;
++ } else {
++ return "System call other";
++ }
++ default:
++ break;
++ }
++
++ return "Unknown";
++}
++#endif
++
+ int ast_iostream_get_fd(struct ast_iostream *stream)
+ {
+ return stream->fd;
+@@ -109,13 +142,16 @@ static ssize_t iostream_read(struct ast_iostream *stream, void *buf, size_t size
+ #if defined(DO_SSL)
+ if (stream->ssl) {
+ for (;;) {
++ int sslerr;
++ char err[256];
+ res = SSL_read(stream->ssl, buf, size);
+ if (0 < res) {
+ /* We read some payload data. */
+ stream->timeout = stream->timeout_reset;
+ return res;
+ }
+- switch (SSL_get_error(stream->ssl, res)) {
++ sslerr = SSL_get_error(stream->ssl, res);
++ switch (sslerr) {
+ case SSL_ERROR_ZERO_RETURN:
+ /* Report EOF for a shutdown */
+ ast_debug(1, "TLS clean shutdown alert reading data\n");
+@@ -163,7 +199,8 @@ static ssize_t iostream_read(struct ast_iostream *stream, void *buf, size_t size
+ break;
+ default:
+ /* Report EOF for an undecoded SSL or transport error. */
+- ast_debug(1, "TLS transport or SSL error reading data\n");
++ ast_debug(1, "TLS transport or SSL error reading data: %s, %s\n", ERR_error_string(sslerr, err),
++ ssl_error_to_string(sslerr, res));
+ return 0;
+ }
+ if (!ms) {
+@@ -318,6 +355,8 @@ ssize_t ast_iostream_write(struct ast_iostream *stream, const void *buf, size_t
+ written = 0;
+ remaining = size;
+ for (;;) {
++ int sslerr;
++ char err[256];
+ res = SSL_write(stream->ssl, buf + written, remaining);
+ if (res == remaining) {
+ /* Everything was written. */
+@@ -329,7 +368,8 @@ ssize_t ast_iostream_write(struct ast_iostream *stream, const void *buf, size_t
+ remaining -= res;
+ continue;
+ }
+- switch (SSL_get_error(stream->ssl, res)) {
++ sslerr = SSL_get_error(stream->ssl, res);
++ switch (sslerr) {
+ case SSL_ERROR_ZERO_RETURN:
+ ast_debug(1, "TLS clean shutdown alert writing data\n");
+ if (written) {
+@@ -358,7 +398,8 @@ ssize_t ast_iostream_write(struct ast_iostream *stream, const void *buf, size_t
+ break;
+ default:
+ /* Undecoded SSL or transport error. */
+- ast_debug(1, "TLS transport or SSL error writing data\n");
++ ast_debug(1, "TLS transport or SSL error writing data: %s, %s\n", ERR_error_string(sslerr, err),
++ ssl_error_to_string(sslerr, res));
+ if (written) {
+ /* Report partial write. */
+ return written;
+@@ -461,8 +502,10 @@ int ast_iostream_close(struct ast_iostream *stream)
+ */
+ res = SSL_shutdown(stream->ssl);
+ if (res < 0) {
+- ast_log(LOG_ERROR, "SSL_shutdown() failed: %d\n",
+- SSL_get_error(stream->ssl, res));
++ int sslerr = SSL_get_error(stream->ssl, res);
++ char err[256];
++ ast_log(LOG_ERROR, "SSL_shutdown() failed: %s, %s\n",
++ ERR_error_string(sslerr, err), ssl_error_to_string(sslerr, res));
+ }
+
+ if (!stream->ssl->server) {
+@@ -524,7 +567,7 @@ int ast_iostream_start_tls(struct ast_iostream **pstream, SSL_CTX *ssl_ctx, int
+ #ifdef DO_SSL
+ struct ast_iostream *stream = *pstream;
+ int (*ssl_setup)(SSL *) = client ? SSL_connect : SSL_accept;
+- char err[256];
++ int res;
+
+ stream->ssl = SSL_new(ssl_ctx);
+ if (!stream->ssl) {
+@@ -541,9 +584,13 @@ int ast_iostream_start_tls(struct ast_iostream **pstream, SSL_CTX *ssl_ctx, int
+ */
+ SSL_set_fd(stream->ssl, stream->fd);
+
+- if (ssl_setup(stream->ssl) <= 0) {
+- ast_log(LOG_ERROR, "Problem setting up ssl connection: %s\n",
+- ERR_error_string(ERR_get_error(), err));
++ res = ssl_setup(stream->ssl);
++ if (res <= 0) {
++ int sslerr = SSL_get_error(stream->ssl, res);
++ char err[256];
++
++ ast_log(LOG_ERROR, "Problem setting up ssl connection: %s, %s\n",
++ ERR_error_string(sslerr, err), ssl_error_to_string(sslerr, res));
+ errno = EIO;
+ return -1;
+ }
+--
+2.13.0