client = client_create(conn->fd, FALSE, pool, set, other_sets,
&local_ip, &conn->remote_ip);
} else {
- fd_ssl = ssl_proxy_alloc(conn->fd, &conn->remote_ip, set,
+ fd_ssl = ssl_proxy_alloc(conn->fd, &conn->remote_ip, pool, set,
&proxy);
if (fd_ssl == -1) {
net_disconnect(conn->fd);
struct client *client;
struct ip_addr ip;
const struct login_settings *set;
+ pool_t set_pool;
int fd_ssl, fd_plain;
struct io *io_ssl_read, *io_ssl_write, *io_plain_read, *io_plain_write;
static int
ssl_proxy_alloc_common(SSL_CTX *ssl_ctx, int fd, const struct ip_addr *ip,
- const struct login_settings *set,
+ pool_t set_pool, const struct login_settings *set,
struct ssl_proxy **proxy_r)
{
struct ssl_proxy *proxy;
proxy->fd_ssl = fd;
proxy->fd_plain = sfd[0];
proxy->ip = *ip;
- SSL_set_ex_data(ssl, extdata_index, proxy);
+ proxy->set_pool = set_pool;
+ pool_ref(set_pool);
+ SSL_set_ex_data(ssl, extdata_index, proxy);
ssl_proxy_count++;
DLLIST_PREPEND(&ssl_proxies, proxy);
return ctx;
}
-int ssl_proxy_alloc(int fd, const struct ip_addr *ip,
+int ssl_proxy_alloc(int fd, const struct ip_addr *ip, pool_t set_pool,
const struct login_settings *set,
struct ssl_proxy **proxy_r)
{
struct ssl_server_context *ctx;
ctx = ssl_server_context_get(set);
- return ssl_proxy_alloc_common(ctx->ctx, fd, ip, set, proxy_r);
+ return ssl_proxy_alloc_common(ctx->ctx, fd, ip,
+ set_pool, set, proxy_r);
}
-int ssl_proxy_client_alloc(int fd, struct ip_addr *ip,
+int ssl_proxy_client_alloc(int fd, struct ip_addr *ip, pool_t set_pool,
const struct login_settings *set,
ssl_handshake_callback_t *callback, void *context,
struct ssl_proxy **proxy_r)
{
int ret;
- ret = ssl_proxy_alloc_common(ssl_client_ctx, fd, ip, set, proxy_r);
+ ret = ssl_proxy_alloc_common(ssl_client_ctx, fd, ip,
+ set_pool, set, proxy_r);
if (ret < 0)
return -1;
SSL_free(proxy->ssl);
+ pool_unref(&proxy->set_pool);
i_free(proxy->last_error);
i_free(proxy);
}
/* establish SSL connection with the given fd, returns a new fd which you
must use from now on, or -1 if error occurred. Unless -1 is returned,
the given fd must be simply forgotten. */
-int ssl_proxy_alloc(int fd, const struct ip_addr *ip,
+int ssl_proxy_alloc(int fd, const struct ip_addr *ip, pool_t set_pool,
const struct login_settings *set,
struct ssl_proxy **proxy_r);
-int ssl_proxy_client_alloc(int fd, struct ip_addr *ip,
+int ssl_proxy_client_alloc(int fd, struct ip_addr *ip, pool_t set_pool,
const struct login_settings *set,
ssl_handshake_callback_t *callback, void *context,
struct ssl_proxy **proxy_r);