当sapp先淘汰时,pmeinfo中引用了已经无效的streaminfo,导致段错误。修复cmsg未释放干净的bug。修复cmsg double free的bug。

This commit is contained in:
zhengchao
2019-06-05 16:32:40 +08:00
parent 88bf912555
commit c899449a50

View File

@@ -54,7 +54,13 @@ struct pme_info{
int tfe_release;
int sapp_release;
//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 end_time;
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_generate_random(uu);
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->logger = logger;
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
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
const struct layer_addr *addr = &(pmeinfo->stream->addr);
const struct layer_addr *addr = pmeinfo->addr;
char client_ip_str[INET6_ADDRSTRLEN] = "";
char server_ip_str[INET6_ADDRSTRLEN] = "";
switch(addr->addrtype){
@@ -224,7 +230,7 @@ static int sendlog_to_kafka(struct pme_info *pmeinfo, void *local_logger){
//direction: 0
cJSON_AddNumberToObject(log_obj, "direction", 0);
//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
char local_ipv4_str[INET6_ADDRSTRLEN];
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
cJSON_AddStringToObject(log_obj, "sni", pmeinfo->sni);
//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
cJSON_AddNumberToObject(log_obj, "s2c_pkt_num", pmeinfo->stream->ptcpdetail->clientpktnum);
cJSON_AddNumberToObject(log_obj, "s2c_pkt_num", pmeinfo->client_pkts);
//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
cJSON_AddNumberToObject(log_obj, "s2c_byte_num", pmeinfo->stream->ptcpdetail->clientbytes);
cJSON_AddNumberToObject(log_obj, "s2c_byte_num", pmeinfo->client_bytes);
int ret = -1;
char *log_msg = cJSON_PrintUnformatted(log_obj);
cJSON_Delete(log_obj);
@@ -284,6 +290,8 @@ static void pme_info_destroy(struct pme_info *pmeinfo){
if(pmeinfo->server_tcpopt != NULL){
FREE(&(pmeinfo->server_tcpopt));
}
layer_addr_free(pmeinfo->addr);
pmeinfo->addr=NULL;
FREE(&pmeinfo);
}
/* 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));
int len = pktinfo->ip_totlen;
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){
case KNI_ACTION_INTERCEPT:
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_CERT_VERIFY, sizeof(pmeinfo->ssl_cert_verify), logger);
wrapped_kni_cmsg_get(pmeinfo, cmsg, TFE_CMSG_SSL_ERROR, sizeof(pmeinfo->ssl_error), logger);
FREE(&cmsg);
pmeinfo->tfe_release = 1;
pmeinfo->end_time = time(NULL);
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);
}
}
FREE(&cmsg);
kni_cmsg_destroy(cmsg);
return 0;
}