OpenSSL fd map a real map now.
This commit is contained in:
+13
-64
@@ -64,6 +64,7 @@
|
|||||||
#define CERT_STATUS_BAD 3
|
#define CERT_STATUS_BAD 3
|
||||||
#define CERT_STATUS_USER_ACCEPTED 4
|
#define CERT_STATUS_USER_ACCEPTED 4
|
||||||
|
|
||||||
|
#include <map>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
@@ -83,11 +84,6 @@ toServer( const DilloUrl *const url )
|
|||||||
return std::make_unique< Server_t >( Server_t{ URL_HOST( url ), URL_PORT( url ), CERT_STATUS_NONE } );
|
return std::make_unique< Server_t >( Server_t{ URL_HOST( url ), URL_PORT( url ), CERT_STATUS_NONE } );
|
||||||
}
|
}
|
||||||
|
|
||||||
struct FdMapEntry_t{
|
|
||||||
int fd;
|
|
||||||
int connkey;
|
|
||||||
};
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Data type for TLS connection information
|
* Data type for TLS connection information
|
||||||
*/
|
*/
|
||||||
@@ -108,33 +104,18 @@ static Klist_t *conn_list = NULL;
|
|||||||
*/
|
*/
|
||||||
static SSL_CTX *ssl_context;
|
static SSL_CTX *ssl_context;
|
||||||
static std::vector< std::unique_ptr< Server_t > > servers;
|
static std::vector< std::unique_ptr< Server_t > > servers;
|
||||||
static Dlist *fd_map;
|
static std::map< int, int > fd_map;
|
||||||
|
|
||||||
static void Tls_connect_cb(int fd, void *vconnkey);
|
static void Tls_connect_cb(int fd, void *vconnkey);
|
||||||
|
|
||||||
/*
|
|
||||||
* Compare by FD.
|
|
||||||
*/
|
|
||||||
static int Tls_fd_map_cmp(const void *v1, const void *v2)
|
|
||||||
{
|
|
||||||
int fd = VOIDP2INT(v2);
|
|
||||||
const FdMapEntry_t *e = reinterpret_cast< const FdMapEntry_t * >( v1 );
|
|
||||||
|
|
||||||
return (fd != e->fd);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void Tls_fd_map_add_entry(int fd, int connkey)
|
static void Tls_fd_map_add_entry(int fd, int connkey)
|
||||||
{
|
{
|
||||||
FdMapEntry_t *e = std::make_unique< FdMapEntry_t >().release();
|
if( fd_map.contains( fd ) ) {
|
||||||
e->fd = fd;
|
MSG_ERR("TLS FD ENTRY ALREADY FOUND FOR %d\n", fd);
|
||||||
e->connkey = connkey;
|
|
||||||
|
|
||||||
if (dList_find_custom(fd_map, INT2VOIDP(e->fd), Tls_fd_map_cmp)) {
|
|
||||||
MSG_ERR("TLS FD ENTRY ALREADY FOUND FOR %d\n", e->fd);
|
|
||||||
assert(0);
|
assert(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
dList_append(fd_map, e);
|
fd_map[ fd ]= connkey;
|
||||||
//MSG("ADD ENTRY %d %s\n", e->fd, URL_STR(sd->url));
|
//MSG("ADD ENTRY %d %s\n", e->fd, URL_STR(sd->url));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -143,12 +124,9 @@ static void Tls_fd_map_add_entry(int fd, int connkey)
|
|||||||
*/
|
*/
|
||||||
static void Tls_fd_map_remove_entry(int fd)
|
static void Tls_fd_map_remove_entry(int fd)
|
||||||
{
|
{
|
||||||
std::unique_ptr< FdMapEntry_t > data { reinterpret_cast< FdMapEntry_t * >( dList_find_custom(fd_map, INT2VOIDP(fd), Tls_fd_map_cmp) ) };
|
|
||||||
|
|
||||||
//MSG("REMOVE ENTRY %d\n", fd);
|
//MSG("REMOVE ENTRY %d\n", fd);
|
||||||
if (data) {
|
if (fd_map.contains( fd )) {
|
||||||
dList_remove_fast(fd_map, data.get());
|
fd_map.erase( fd );
|
||||||
data.reset();
|
|
||||||
} else {
|
} else {
|
||||||
MSG("TLS FD ENTRY NOT FOUND FOR %d\n", fd);
|
MSG("TLS FD ENTRY NOT FOUND FOR %d\n", fd);
|
||||||
}
|
}
|
||||||
@@ -162,11 +140,9 @@ void *a_Tls_openssl_connection(int fd)
|
|||||||
{
|
{
|
||||||
Conn_t *conn;
|
Conn_t *conn;
|
||||||
|
|
||||||
if (fd_map) {
|
if (fd_map.contains(fd)) {
|
||||||
FdMapEntry_t *fme = reinterpret_cast< FdMapEntry_t * >( dList_find_custom(fd_map, INT2VOIDP(fd),
|
|
||||||
Tls_fd_map_cmp) );
|
|
||||||
|
|
||||||
if (fme && (conn = reinterpret_cast< Conn_t * >( a_Klist_get_data(conn_list, fme->connkey) )))
|
if ((conn = reinterpret_cast< Conn_t * >( a_Klist_get_data(conn_list, fd_map.at( fd )) )))
|
||||||
return conn;
|
return conn;
|
||||||
}
|
}
|
||||||
return NULL;
|
return NULL;
|
||||||
@@ -324,8 +300,6 @@ void a_Tls_openssl_init(void)
|
|||||||
SSL_CTX_set_verify(ssl_context, SSL_VERIFY_NONE, NULL);
|
SSL_CTX_set_verify(ssl_context, SSL_VERIFY_NONE, NULL);
|
||||||
|
|
||||||
Tls_load_certificates();
|
Tls_load_certificates();
|
||||||
|
|
||||||
fd_map = dList_new(20);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -1370,33 +1344,8 @@ int a_Tls_openssl_write(void *conn, void *buf, size_t len)
|
|||||||
|
|
||||||
void a_Tls_openssl_close_by_fd(int fd)
|
void a_Tls_openssl_close_by_fd(int fd)
|
||||||
{
|
{
|
||||||
FdMapEntry_t *fme = reinterpret_cast< FdMapEntry_t * >( dList_find_custom(fd_map, INT2VOIDP(fd),
|
if (fd_map.contains( fd )) {
|
||||||
Tls_fd_map_cmp) );
|
Tls_close_by_key(fd_map.at( fd ));
|
||||||
|
|
||||||
if (fme) {
|
|
||||||
Tls_close_by_key(fme->connkey);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void Tls_servers_freeall(void)
|
|
||||||
{
|
|
||||||
int i, n = servers.size();
|
|
||||||
|
|
||||||
for (i = 0; i < n; i++) {
|
|
||||||
std::unique_ptr< Server_t > s { std::move( servers.at( i ) ) };
|
|
||||||
}
|
|
||||||
servers.clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
static void Tls_fd_map_remove_all(void)
|
|
||||||
{
|
|
||||||
if (fd_map) {
|
|
||||||
int i, n = dList_length(fd_map);
|
|
||||||
|
|
||||||
for (i = 0; i < n; i++) {
|
|
||||||
std::unique_ptr< FdMapEntry_t >fme{ reinterpret_cast<FdMapEntry_t *>( dList_nth_data(fd_map, i) ) };
|
|
||||||
}
|
|
||||||
dList_free(fd_map);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1407,6 +1356,6 @@ void a_Tls_openssl_freeall(void)
|
|||||||
{
|
{
|
||||||
if (ssl_context)
|
if (ssl_context)
|
||||||
SSL_CTX_free(ssl_context);
|
SSL_CTX_free(ssl_context);
|
||||||
Tls_fd_map_remove_all();
|
fd_map.clear();
|
||||||
Tls_servers_freeall();
|
servers.clear();
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user