@@ -251,8 +251,8 @@ static long __bpf_get_stackid(struct bpf_map *map,
251251{
252252 struct bpf_stack_map * smap = container_of (map , struct bpf_stack_map , map );
253253 struct stack_map_bucket * bucket , * new_bucket , * old_bucket ;
254+ u32 hash , id , trace_nr , trace_len , i , max_depth ;
254255 u32 skip = flags & BPF_F_SKIP_FIELD_MASK ;
255- u32 hash , id , trace_nr , trace_len , i ;
256256 bool user = flags & BPF_F_USER_STACK ;
257257 u64 * ips ;
258258 bool hash_matches ;
@@ -261,7 +261,8 @@ static long __bpf_get_stackid(struct bpf_map *map,
261261 /* skipping more than usable stack trace */
262262 return - EFAULT ;
263263
264- trace_nr = trace -> nr - skip ;
264+ max_depth = stack_map_calculate_max_depth (map -> value_size , stack_map_data_size (map ), flags );
265+ trace_nr = min_t (u32 , trace -> nr - skip , max_depth - skip );
265266 trace_len = trace_nr * sizeof (u64 );
266267 ips = trace -> ip + skip ;
267268 hash = jhash2 ((u32 * )ips , trace_len / sizeof (u32 ), 0 );
@@ -390,15 +391,11 @@ BPF_CALL_3(bpf_get_stackid_pe, struct bpf_perf_event_data_kern *, ctx,
390391 return - EFAULT ;
391392
392393 nr_kernel = count_kernel_ip (trace );
394+ __u64 nr = trace -> nr ; /* save original */
393395
394396 if (kernel ) {
395- __u64 nr = trace -> nr ;
396-
397397 trace -> nr = nr_kernel ;
398398 ret = __bpf_get_stackid (map , trace , flags );
399-
400- /* restore nr */
401- trace -> nr = nr ;
402399 } else { /* user */
403400 u64 skip = flags & BPF_F_SKIP_FIELD_MASK ;
404401
@@ -409,6 +406,10 @@ BPF_CALL_3(bpf_get_stackid_pe, struct bpf_perf_event_data_kern *, ctx,
409406 flags = (flags & ~BPF_F_SKIP_FIELD_MASK ) | skip ;
410407 ret = __bpf_get_stackid (map , trace , flags );
411408 }
409+
410+ /* restore nr */
411+ trace -> nr = nr ;
412+
412413 return ret ;
413414}
414415
0 commit comments