summaryrefslogtreecommitdiff
path: root/third-party/pjproject/patches/0001-2.4.5-fix-for-tls-async-ops.patch
diff options
context:
space:
mode:
Diffstat (limited to 'third-party/pjproject/patches/0001-2.4.5-fix-for-tls-async-ops.patch')
-rw-r--r--third-party/pjproject/patches/0001-2.4.5-fix-for-tls-async-ops.patch224
1 files changed, 224 insertions, 0 deletions
diff --git a/third-party/pjproject/patches/0001-2.4.5-fix-for-tls-async-ops.patch b/third-party/pjproject/patches/0001-2.4.5-fix-for-tls-async-ops.patch
new file mode 100644
index 000000000..33fc8ea4e
--- /dev/null
+++ b/third-party/pjproject/patches/0001-2.4.5-fix-for-tls-async-ops.patch
@@ -0,0 +1,224 @@
+diff --git a/pjlib/include/pj/ssl_sock.h b/pjlib/include/pj/ssl_sock.h
+index 1682bda..a69af32 100644
+--- a/pjlib/include/pj/ssl_sock.h
++++ b/pjlib/include/pj/ssl_sock.h
+@@ -864,6 +864,18 @@ PJ_DECL(void) pj_ssl_sock_param_default(pj_ssl_sock_param *param);
+
+
+ /**
++ * Duplicate pj_ssl_sock_param.
++ *
++ * @param pool Pool to allocate memory.
++ * @param dst Destination parameter.
++ * @param src Source parameter.
++ */
++PJ_DECL(void) pj_ssl_sock_param_copy(pj_pool_t *pool,
++ pj_ssl_sock_param *dst,
++ const pj_ssl_sock_param *src);
++
++
++/**
+ * Create secure socket instance.
+ *
+ * @param pool The pool for allocating secure socket instance.
+@@ -1115,6 +1127,30 @@ PJ_DECL(pj_status_t) pj_ssl_sock_start_accept(pj_ssl_sock_t *ssock,
+
+
+ /**
++ * Same as #pj_ssl_sock_start_accept(), but application can provide
++ * a secure socket parameter, which will be used to create a new secure
++ * socket reported in \a on_accept_complete() callback when there is
++ * an incoming connection.
++ *
++ * @param ssock The secure socket.
++ * @param pool Pool used to allocate some internal data for the
++ * operation.
++ * @param localaddr Local address to bind on.
++ * @param addr_len Length of buffer containing local address.
++ * @param newsock_param Secure socket parameter for new accepted sockets.
++ *
++ * @return PJ_SUCCESS if the operation has been successful,
++ * or the appropriate error code on failure.
++ */
++PJ_DECL(pj_status_t)
++pj_ssl_sock_start_accept2(pj_ssl_sock_t *ssock,
++ pj_pool_t *pool,
++ const pj_sockaddr_t *local_addr,
++ int addr_len,
++ const pj_ssl_sock_param *newsock_param);
++
++
++/**
+ * Starts asynchronous socket connect() operation and SSL/TLS handshaking
+ * for this socket. Once the connection is done (either successfully or not),
+ * the \a on_connect_complete() callback will be called.
+diff --git a/pjlib/src/pj/ssl_sock_common.c b/pjlib/src/pj/ssl_sock_common.c
+index 913efee..717ab1d 100644
+--- a/pjlib/src/pj/ssl_sock_common.c
++++ b/pjlib/src/pj/ssl_sock_common.c
+@@ -19,6 +19,7 @@
+ #include <pj/ssl_sock.h>
+ #include <pj/assert.h>
+ #include <pj/errno.h>
++#include <pj/pool.h>
+ #include <pj/string.h>
+
+ /*
+@@ -48,6 +49,31 @@ PJ_DEF(void) pj_ssl_sock_param_default(pj_ssl_sock_param *param)
+ }
+
+
++/*
++ * Duplicate SSL socket parameter.
++ */
++PJ_DEF(void) pj_ssl_sock_param_copy( pj_pool_t *pool,
++ pj_ssl_sock_param *dst,
++ const pj_ssl_sock_param *src)
++{
++ /* Init secure socket param */
++ pj_memcpy(dst, src, sizeof(*dst));
++ if (src->ciphers_num > 0) {
++ unsigned i;
++ dst->ciphers = (pj_ssl_cipher*)
++ pj_pool_calloc(pool, src->ciphers_num,
++ sizeof(pj_ssl_cipher));
++ for (i = 0; i < src->ciphers_num; ++i)
++ dst->ciphers[i] = src->ciphers[i];
++ }
++
++ if (src->server_name.slen) {
++ /* Server name must be null-terminated */
++ pj_strdup_with_null(pool, &dst->server_name, &src->server_name);
++ }
++}
++
++
+ PJ_DEF(pj_status_t) pj_ssl_cert_get_verify_status_strings(
+ pj_uint32_t verify_status,
+ const char *error_strings[],
+diff --git a/pjlib/src/pj/ssl_sock_ossl.c b/pjlib/src/pj/ssl_sock_ossl.c
+index 40a5a1e..6a701b7 100644
+--- a/pjlib/src/pj/ssl_sock_ossl.c
++++ b/pjlib/src/pj/ssl_sock_ossl.c
+@@ -141,6 +141,7 @@ struct pj_ssl_sock_t
+ pj_pool_t *pool;
+ pj_ssl_sock_t *parent;
+ pj_ssl_sock_param param;
++ pj_ssl_sock_param newsock_param;
+ pj_ssl_cert_t *cert;
+
+ pj_ssl_cert_info local_cert_info;
+@@ -1757,11 +1758,9 @@ static pj_bool_t asock_on_accept_complete (pj_activesock_t *asock,
+ unsigned i;
+ pj_status_t status;
+
+- PJ_UNUSED_ARG(src_addr_len);
+-
+ /* Create new SSL socket instance */
+- status = pj_ssl_sock_create(ssock_parent->pool, &ssock_parent->param,
+- &ssock);
++ status = pj_ssl_sock_create(ssock_parent->pool,
++ &ssock_parent->newsock_param, &ssock);
+ if (status != PJ_SUCCESS)
+ goto on_return;
+
+@@ -2183,20 +2182,8 @@ PJ_DEF(pj_status_t) pj_ssl_sock_create (pj_pool_t *pool,
+ return status;
+
+ /* Init secure socket param */
+- ssock->param = *param;
++ pj_ssl_sock_param_copy(pool, &ssock->param, param);
+ ssock->param.read_buffer_size = ((ssock->param.read_buffer_size+7)>>3)<<3;
+- if (param->ciphers_num > 0) {
+- unsigned i;
+- ssock->param.ciphers = (pj_ssl_cipher*)
+- pj_pool_calloc(pool, param->ciphers_num,
+- sizeof(pj_ssl_cipher));
+- for (i = 0; i < param->ciphers_num; ++i)
+- ssock->param.ciphers[i] = param->ciphers[i];
+- }
+-
+- /* Server name must be null-terminated */
+- pj_strdup_with_null(pool, &ssock->param.server_name,
+- &param->server_name);
+
+ /* Finally */
+ *p_ssock = ssock;
+@@ -2617,12 +2604,36 @@ PJ_DEF(pj_status_t) pj_ssl_sock_start_accept (pj_ssl_sock_t *ssock,
+ const pj_sockaddr_t *localaddr,
+ int addr_len)
+ {
++ return pj_ssl_sock_start_accept2(ssock, pool, localaddr, addr_len,
++ &ssock->param);
++}
++
++
++/**
++ * Same as #pj_ssl_sock_start_accept(), but application provides parameter
++ * for new accepted secure sockets.
++ */
++PJ_DEF(pj_status_t)
++pj_ssl_sock_start_accept2(pj_ssl_sock_t *ssock,
++ pj_pool_t *pool,
++ const pj_sockaddr_t *localaddr,
++ int addr_len,
++ const pj_ssl_sock_param *newsock_param)
++{
+ pj_activesock_cb asock_cb;
+ pj_activesock_cfg asock_cfg;
+ pj_status_t status;
+
+ PJ_ASSERT_RETURN(ssock && pool && localaddr && addr_len, PJ_EINVAL);
+
++ /* Verify new socket parameters */
++ if (newsock_param->grp_lock != ssock->param.grp_lock ||
++ newsock_param->sock_af != ssock->param.sock_af ||
++ newsock_param->sock_type != ssock->param.sock_type)
++ {
++ return PJ_EINVAL;
++ }
++
+ /* Create socket */
+ status = pj_sock_socket(ssock->param.sock_af, ssock->param.sock_type, 0,
+ &ssock->sock);
+@@ -2691,6 +2702,7 @@ PJ_DEF(pj_status_t) pj_ssl_sock_start_accept (pj_ssl_sock_t *ssock,
+ goto on_error;
+
+ /* Start accepting */
++ pj_ssl_sock_param_copy(pool, &ssock->newsock_param, newsock_param);
+ status = pj_activesock_start_accept(ssock->asock, pool);
+ if (status != PJ_SUCCESS)
+ goto on_error;
+diff --git a/pjsip/src/pjsip/sip_transport_tls.c b/pjsip/src/pjsip/sip_transport_tls.c
+index a9e95fb..91d99a7 100644
+--- a/pjsip/src/pjsip/sip_transport_tls.c
++++ b/pjsip/src/pjsip/sip_transport_tls.c
+@@ -314,7 +314,7 @@ PJ_DEF(pj_status_t) pjsip_tls_transport_start2( pjsip_endpoint *endpt,
+ int af, sip_ssl_method;
+ pj_uint32_t sip_ssl_proto;
+ struct tls_listener *listener;
+- pj_ssl_sock_param ssock_param;
++ pj_ssl_sock_param ssock_param, newsock_param;
+ pj_sockaddr *listener_addr;
+ pj_bool_t has_listener;
+ pj_status_t status;
+@@ -473,9 +473,14 @@ PJ_DEF(pj_status_t) pjsip_tls_transport_start2( pjsip_endpoint *endpt,
+ */
+ has_listener = PJ_FALSE;
+
+- status = pj_ssl_sock_start_accept(listener->ssock, pool,
++ pj_memcpy(&newsock_param, &ssock_param, sizeof(newsock_param));
++ newsock_param.async_cnt = 1;
++ newsock_param.cb.on_data_read = &on_data_read;
++ newsock_param.cb.on_data_sent = &on_data_sent;
++ status = pj_ssl_sock_start_accept2(listener->ssock, pool,
+ (pj_sockaddr_t*)listener_addr,
+- pj_sockaddr_get_len((pj_sockaddr_t*)listener_addr));
++ pj_sockaddr_get_len((pj_sockaddr_t*)listener_addr),
++ &newsock_param);
+ if (status == PJ_SUCCESS || status == PJ_EPENDING) {
+ pj_ssl_sock_info info;
+ has_listener = PJ_TRUE;
+--
+cgit v0.11.2
+