Procházet zdrojové kódy

Feature #TASK_QT-31498 处理合并后指令溢出

Carl před 6 měsíci
rodič
revize
6884615e46

+ 3 - 4
ebpftracer/ebpf/utrace/java/include/java_common.h

@@ -57,14 +57,13 @@ struct sock_t {
 	void * payload_len_p;
 	char payload[MAX_LEN];
 	char header_stream[CW_STREAM_HEADER_LEN];
-	char host[30];
-	struct ebpf_proc_info* proc_info;
+	char host[MAX_HOSTNAME_SIZE];
 };
 
 struct {
 	__uint(type, BPF_MAP_TYPE_PERCPU_ARRAY);
-	__type(key, u32);
-	__type(value, struct sock_t);
+	__uint(key_size, sizeof(u32));
+	__uint(value_size, sizeof(struct sock_t));
 	__uint(max_entries, 1);
 } socket_heap SEC(".maps");
 

+ 16 - 17
ebpftracer/ebpf/utrace/java/net/client.probe.bpf.c

@@ -72,15 +72,17 @@ int uprobe_Java_java_net_SocketOutputStream_socketWrite0(struct pt_regs *ctx) {
 
 	int key = 0;
 	struct sock_t *map_data = bpf_map_lookup_elem(&socket_heap, &key);
-	if (!map_data) {
+	if (map_data == NULL) {
 		cw_bpf_debug("[java client] Failed to lookup socket_heap\n");
 		return 1;
 	}
 
+	__builtin_memset(map_data->header_stream, 0, sizeof(map_data->header_stream));
+	__builtin_memset(map_data->host, 0, sizeof(map_data->host));
 	// 获取jbytearray
 	__u32 tgid = (__u32) (bpf_get_current_pid_tgid() >> 32);
-	map_data->proc_info = bpf_map_lookup_elem(&proc_info_map, &tgid);
-	if (!map_data->proc_info) {
+	struct ebpf_proc_info *proc_info = bpf_map_lookup_elem(&proc_info_map, &tgid);
+	if (!proc_info) {
 		return 0;
 	}
 
@@ -88,7 +90,7 @@ int uprobe_Java_java_net_SocketOutputStream_socketWrite0(struct pt_regs *ctx) {
 	void *jbytearray_ptr = NULL;
 
 	// 1003 是 javaAOT 的
-	if (map_data->proc_info->code_type == CodeTypeJavaAot) {
+	if (proc_info->code_type == CodeTypeJavaAot) {
 		jbytearray_ptr = (void *) (PT_REGS_SP(ctx)) + 0x8 + 0x10060 + 0x20;
 	} else {
 		jbytearray_ptr = (void *) PT_REGS_PARM4(ctx);
@@ -307,24 +309,21 @@ PROGUP(java_build_header)(struct pt_regs *ctx) {
 		return 1;
 	}
 
-	if (!map_data->proc_info)
-		return 1;
-
-	struct ebpf_proc_info proc_info;
-	bpf_probe_read(&proc_info, sizeof(struct ebpf_proc_info), map_data->proc_info);
+	__u32 tgid = (__u32) (bpf_get_current_pid_tgid() >> 32);
+	struct ebpf_proc_info *proc_info = bpf_map_lookup_elem(&proc_info_map, &tgid);
+	if (!proc_info) {
+		return 0;
+	}
 
-	char host[30];
-	bpf_probe_read(&host, sizeof host, map_data->host);
-	host[29] = '\0';
 	for (u32 i = 0; i < 30; i++) {
-		if (host[i] == '\r') {
-			host[i] = '\0';
+		if (map_data->host[i] == '\r') {
+			map_data->host[i] = '\0';
 			break;
 		}
 	}
 	cw_bpf_debug("[java client] http host %s\n", map_data->host);
 
-	struct apm_span_context *cw_sc = build_sc(proc_info, host);
+	struct apm_span_context *cw_sc = build_sc(*proc_info, map_data->host);
 	if (cw_sc == NULL) {
 		return 0;
 	}
@@ -438,8 +437,8 @@ int javaaot_asmnop(struct pt_regs *ctx) {
 
 	// 获取jbytearray
 	__u32 tgid = (__u32) (bpf_get_current_pid_tgid() >> 32);
-	map_data->proc_info = bpf_map_lookup_elem(&proc_info_map, &tgid);
-	if (!map_data->proc_info) {
+	struct ebpf_proc_info *proc_info = bpf_map_lookup_elem(&proc_info_map, &tgid);
+	if (!proc_info) {
 		return 0;
 	}