当sapp先淘汰时,pmeinfo中引用了已经无效的streaminfo,导致段错误。修复cmsg未释放干净的bug。修复cmsg double free的bug。
This commit is contained in:
@@ -54,7 +54,13 @@ struct pme_info{
|
|||||||
int tfe_release;
|
int tfe_release;
|
||||||
int sapp_release;
|
int sapp_release;
|
||||||
//kafka log
|
//kafka log
|
||||||
struct streaminfo *stream;
|
struct layer_addr *addr;
|
||||||
|
unsigned char dir;
|
||||||
|
uint64_t server_bytes;
|
||||||
|
uint64_t client_bytes;
|
||||||
|
uint64_t server_pkts;
|
||||||
|
uint64_t client_pkts;
|
||||||
|
|
||||||
time_t start_time;
|
time_t start_time;
|
||||||
time_t end_time;
|
time_t end_time;
|
||||||
uint64_t con_duration_ms;
|
uint64_t con_duration_ms;
|
||||||
@@ -143,7 +149,7 @@ static struct pme_info* pme_info_new(const struct streaminfo *stream, int thread
|
|||||||
uuid_t uu;
|
uuid_t uu;
|
||||||
uuid_generate_random(uu);
|
uuid_generate_random(uu);
|
||||||
uuid_unparse(uu, pmeinfo->stream_trace_id);
|
uuid_unparse(uu, pmeinfo->stream_trace_id);
|
||||||
pmeinfo->stream = (struct streaminfo*)stream;
|
pmeinfo->addr = layer_addr_dup(&(stream->addr));
|
||||||
pmeinfo->start_time = time(NULL);
|
pmeinfo->start_time = time(NULL);
|
||||||
pmeinfo->logger = logger;
|
pmeinfo->logger = logger;
|
||||||
FS_operate(g_kni_fs_handle->handle, g_kni_fs_handle->fields[KNI_FIELD_TOT_STM], 0, FS_OP_ADD, 1);
|
FS_operate(g_kni_fs_handle->handle, g_kni_fs_handle->fields[KNI_FIELD_TOT_STM], 0, FS_OP_ADD, 1);
|
||||||
@@ -168,7 +174,7 @@ static int sendlog_to_kafka(struct pme_info *pmeinfo, void *local_logger){
|
|||||||
//con_duration_ms
|
//con_duration_ms
|
||||||
cJSON_AddNumberToObject(log_obj, "con_duration_ms", (pmeinfo->end_time - pmeinfo->start_time) * 1000);
|
cJSON_AddNumberToObject(log_obj, "con_duration_ms", (pmeinfo->end_time - pmeinfo->start_time) * 1000);
|
||||||
//stream_info: addr_type, trans_proto, client_ip, client_port, server_ip, server_port
|
//stream_info: addr_type, trans_proto, client_ip, client_port, server_ip, server_port
|
||||||
const struct layer_addr *addr = &(pmeinfo->stream->addr);
|
const struct layer_addr *addr = pmeinfo->addr;
|
||||||
char client_ip_str[INET6_ADDRSTRLEN] = "";
|
char client_ip_str[INET6_ADDRSTRLEN] = "";
|
||||||
char server_ip_str[INET6_ADDRSTRLEN] = "";
|
char server_ip_str[INET6_ADDRSTRLEN] = "";
|
||||||
switch(addr->addrtype){
|
switch(addr->addrtype){
|
||||||
@@ -224,7 +230,7 @@ static int sendlog_to_kafka(struct pme_info *pmeinfo, void *local_logger){
|
|||||||
//direction: 0
|
//direction: 0
|
||||||
cJSON_AddNumberToObject(log_obj, "direction", 0);
|
cJSON_AddNumberToObject(log_obj, "direction", 0);
|
||||||
//stream_dir: from sapp
|
//stream_dir: from sapp
|
||||||
cJSON_AddNumberToObject(log_obj, "stream_dir", pmeinfo->stream->dir);
|
cJSON_AddNumberToObject(log_obj, "stream_dir", pmeinfo->dir);
|
||||||
//cap_ip: kni ip
|
//cap_ip: kni ip
|
||||||
char local_ipv4_str[INET6_ADDRSTRLEN];
|
char local_ipv4_str[INET6_ADDRSTRLEN];
|
||||||
inet_ntop(AF_INET, &(g_kni_handle->local_ipv4), local_ipv4_str, sizeof(local_ipv4_str));
|
inet_ntop(AF_INET, &(g_kni_handle->local_ipv4), local_ipv4_str, sizeof(local_ipv4_str));
|
||||||
@@ -236,13 +242,13 @@ static int sendlog_to_kafka(struct pme_info *pmeinfo, void *local_logger){
|
|||||||
//sni: ssl only
|
//sni: ssl only
|
||||||
cJSON_AddStringToObject(log_obj, "sni", pmeinfo->sni);
|
cJSON_AddStringToObject(log_obj, "sni", pmeinfo->sni);
|
||||||
//c2s_pkt_num
|
//c2s_pkt_num
|
||||||
cJSON_AddNumberToObject(log_obj, "c2s_pkt_num", pmeinfo->stream->ptcpdetail->serverpktnum);
|
cJSON_AddNumberToObject(log_obj, "c2s_pkt_num", pmeinfo->server_pkts);
|
||||||
//s2c_pkt_num
|
//s2c_pkt_num
|
||||||
cJSON_AddNumberToObject(log_obj, "s2c_pkt_num", pmeinfo->stream->ptcpdetail->clientpktnum);
|
cJSON_AddNumberToObject(log_obj, "s2c_pkt_num", pmeinfo->client_pkts);
|
||||||
//c2s_byte_num
|
//c2s_byte_num
|
||||||
cJSON_AddNumberToObject(log_obj, "c2s_byte_num", pmeinfo->stream->ptcpdetail->serverbytes);
|
cJSON_AddNumberToObject(log_obj, "c2s_byte_num", pmeinfo->server_bytes);
|
||||||
//s2c_byte_num
|
//s2c_byte_num
|
||||||
cJSON_AddNumberToObject(log_obj, "s2c_byte_num", pmeinfo->stream->ptcpdetail->clientbytes);
|
cJSON_AddNumberToObject(log_obj, "s2c_byte_num", pmeinfo->client_bytes);
|
||||||
int ret = -1;
|
int ret = -1;
|
||||||
char *log_msg = cJSON_PrintUnformatted(log_obj);
|
char *log_msg = cJSON_PrintUnformatted(log_obj);
|
||||||
cJSON_Delete(log_obj);
|
cJSON_Delete(log_obj);
|
||||||
@@ -284,6 +290,8 @@ static void pme_info_destroy(struct pme_info *pmeinfo){
|
|||||||
if(pmeinfo->server_tcpopt != NULL){
|
if(pmeinfo->server_tcpopt != NULL){
|
||||||
FREE(&(pmeinfo->server_tcpopt));
|
FREE(&(pmeinfo->server_tcpopt));
|
||||||
}
|
}
|
||||||
|
layer_addr_free(pmeinfo->addr);
|
||||||
|
pmeinfo->addr=NULL;
|
||||||
FREE(&pmeinfo);
|
FREE(&pmeinfo);
|
||||||
}
|
}
|
||||||
/* TODO: segment fault
|
/* TODO: segment fault
|
||||||
@@ -631,6 +639,11 @@ static char close_opstate(const struct streaminfo *stream, struct pme_info *pmei
|
|||||||
kni_stream_addr_trans((struct ipaddr*)(&stream->addr), stream_addr, sizeof(stream_addr));
|
kni_stream_addr_trans((struct ipaddr*)(&stream->addr), stream_addr, sizeof(stream_addr));
|
||||||
int len = pktinfo->ip_totlen;
|
int len = pktinfo->ip_totlen;
|
||||||
int ret;
|
int ret;
|
||||||
|
pmeinfo->server_bytes=stream->ptcpdetail->serverbytes;
|
||||||
|
pmeinfo->client_bytes=stream->ptcpdetail->clientbytes;
|
||||||
|
pmeinfo->server_pkts=stream->ptcpdetail->serverpktnum;
|
||||||
|
pmeinfo->client_pkts=stream->ptcpdetail->clientpktnum;
|
||||||
|
pmeinfo->dir=stream->dir;
|
||||||
switch(pmeinfo->action){
|
switch(pmeinfo->action){
|
||||||
case KNI_ACTION_INTERCEPT:
|
case KNI_ACTION_INTERCEPT:
|
||||||
ret = send_to_tfe(g_kni_handle->marsio_handle, buf, len, thread_seq, pmeinfo->tfe_id);
|
ret = send_to_tfe(g_kni_handle->marsio_handle, buf, len, thread_seq, pmeinfo->tfe_id);
|
||||||
@@ -855,7 +868,6 @@ static long traceid2pme_htable_search_cb(void *data, const uchar *key, uint size
|
|||||||
wrapped_kni_cmsg_get(pmeinfo, cmsg, TFE_CMSG_SSL_PINNING_STATE, sizeof(pmeinfo->pinningst), logger);
|
wrapped_kni_cmsg_get(pmeinfo, cmsg, TFE_CMSG_SSL_PINNING_STATE, sizeof(pmeinfo->pinningst), logger);
|
||||||
wrapped_kni_cmsg_get(pmeinfo, cmsg, TFE_CMSG_SSL_CERT_VERIFY, sizeof(pmeinfo->ssl_cert_verify), logger);
|
wrapped_kni_cmsg_get(pmeinfo, cmsg, TFE_CMSG_SSL_CERT_VERIFY, sizeof(pmeinfo->ssl_cert_verify), logger);
|
||||||
wrapped_kni_cmsg_get(pmeinfo, cmsg, TFE_CMSG_SSL_ERROR, sizeof(pmeinfo->ssl_error), logger);
|
wrapped_kni_cmsg_get(pmeinfo, cmsg, TFE_CMSG_SSL_ERROR, sizeof(pmeinfo->ssl_error), logger);
|
||||||
FREE(&cmsg);
|
|
||||||
pmeinfo->tfe_release = 1;
|
pmeinfo->tfe_release = 1;
|
||||||
pmeinfo->end_time = time(NULL);
|
pmeinfo->end_time = time(NULL);
|
||||||
int key_size = strnlen(pmeinfo->stream_trace_id, sizeof(pmeinfo->stream_trace_id));
|
int key_size = strnlen(pmeinfo->stream_trace_id, sizeof(pmeinfo->stream_trace_id));
|
||||||
@@ -870,7 +882,7 @@ static long traceid2pme_htable_search_cb(void *data, const uchar *key, uint size
|
|||||||
"traceid2pme_htable", pmeinfo->stream_trace_id, key_size);
|
"traceid2pme_htable", pmeinfo->stream_trace_id, key_size);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
FREE(&cmsg);
|
kni_cmsg_destroy(cmsg);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user