ssl stream修复upstream session cache key生成错误的bug。
This commit is contained in:
@@ -146,42 +146,33 @@ static long sess_cache_set_cb(void * data, const uchar * key, uint size, void *
|
||||
}
|
||||
}
|
||||
|
||||
static size_t upsess_mk_key(struct sockaddr * addr, socklen_t addrlen, const char * sni, unsigned char ** key_buf)
|
||||
static size_t upsess_mk_key(struct sockaddr * res, socklen_t addrlen, const char * sni, unsigned char ** key_buf)
|
||||
{
|
||||
size_t key_size = 0;
|
||||
unsigned char * tmp = NULL;
|
||||
size_t tmp_size;
|
||||
short port;
|
||||
size_t snilen;
|
||||
|
||||
switch (addr->sa_family)
|
||||
{
|
||||
case AF_INET:
|
||||
tmp = (unsigned char *)&((struct sockaddr_in *) addr)->sin_addr;
|
||||
tmp_size = sizeof(struct in_addr);
|
||||
port = ((struct sockaddr_in *) addr)->sin_port;
|
||||
unsigned short port;
|
||||
|
||||
char *s = NULL;
|
||||
switch(res->sa_family) {
|
||||
case AF_INET: {
|
||||
struct sockaddr_in *addr_in = (struct sockaddr_in *)res;
|
||||
s = (char*) malloc(INET_ADDRSTRLEN);
|
||||
inet_ntop(AF_INET, &(addr_in->sin_addr), s, INET_ADDRSTRLEN);
|
||||
port = ntohs(addr_in->sin_port);
|
||||
break;
|
||||
case AF_INET6:
|
||||
tmp = (unsigned char *)&((struct sockaddr_in6 *) addr)->sin6_addr;
|
||||
tmp_size = sizeof(struct in6_addr);
|
||||
port = ((struct sockaddr_in6 *) addr)->sin6_port;
|
||||
}
|
||||
case AF_INET6: {
|
||||
struct sockaddr_in6 *addr_in6 = (struct sockaddr_in6 *)res;
|
||||
s = (char*) malloc(INET6_ADDRSTRLEN);
|
||||
inet_ntop(AF_INET6, &(addr_in6->sin6_addr), s, INET6_ADDRSTRLEN);
|
||||
port = ntohs(addr_in6->sin6_port);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
//should never happens.
|
||||
assert(0);
|
||||
break;
|
||||
}
|
||||
|
||||
snilen = sni ? strlen(sni) : 0;
|
||||
key_size = tmp_size + sizeof(port) + snilen;
|
||||
|
||||
*key_buf = ALLOC(unsigned char, key_size);
|
||||
unsigned char * p = *key_buf;
|
||||
|
||||
memcpy(p, tmp, tmp_size);
|
||||
p += tmp_size;
|
||||
memcpy(p, (char *) &port, sizeof(port));
|
||||
p += sizeof(port);
|
||||
|
||||
key_size=asprintf((char**)key_buf,"%s:%u:%s",s, port, sni);
|
||||
free(s);
|
||||
return key_size;
|
||||
}
|
||||
|
||||
@@ -199,6 +190,7 @@ void up_session_set(struct sess_cache * cache, struct sockaddr * addr, socklen_t
|
||||
|
||||
struct sess_set_args set_args={.hash = cache->hash, .new_sess = asn1};
|
||||
MESA_htable_search_cb(cache->hash, key, key_size, sess_cache_set_cb, &set_args, &cb_ret);
|
||||
// printf("%s %s\n", __FUNCTION__, key);
|
||||
if (cb_ret == SESS_CACHE_UPDATE_OLD)
|
||||
{
|
||||
ssl_sess_free_serialized(asn1);
|
||||
@@ -218,6 +210,7 @@ SSL_SESSION * up_session_get(struct sess_cache * cache, struct sockaddr * addr,
|
||||
unsigned char * key = NULL;
|
||||
key_size = upsess_mk_key(addr, addr_len, sni, &key);
|
||||
MESA_htable_search_cb(cache->hash, key, key_size, sess_cache_get_cb, &sess, &cb_ret);
|
||||
// printf("%s %s\n", __FUNCTION__, key);
|
||||
free(key);
|
||||
key = NULL;
|
||||
if (cb_ret == SESS_CACHE_FOUND)
|
||||
@@ -338,4 +331,11 @@ void ssl_sess_cache_destroy(struct sess_cache * cache)
|
||||
free(cache);
|
||||
return;
|
||||
}
|
||||
void ssl_sess_cache_stat(struct sess_cache * cache, long long *size, long long *n_query, long long* n_hit)
|
||||
{
|
||||
*size=MESA_htable_get_elem_num(cache->hash);
|
||||
*n_hit=cache->hit_cnt;
|
||||
*n_query=cache->hit_cnt+cache->miss_cnt;
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user