@@ -702,6 +702,7 @@ struct uprobe_cpu_buffer {
702
702
};
703
703
static struct uprobe_cpu_buffer __percpu * uprobe_cpu_buffer ;
704
704
static int uprobe_buffer_refcnt ;
705
+ #define MAX_UCB_BUFFER_SIZE PAGE_SIZE
705
706
706
707
static int uprobe_buffer_init (void )
707
708
{
@@ -802,9 +803,6 @@ static void __uprobe_trace_func(struct trace_uprobe *tu,
802
803
803
804
WARN_ON (call != trace_file -> event_call );
804
805
805
- if (WARN_ON_ONCE (tu -> tp .size + dsize > PAGE_SIZE ))
806
- return ;
807
-
808
806
if (trace_trigger_soft_disabled (trace_file ))
809
807
return ;
810
808
@@ -1246,6 +1244,11 @@ static int uprobe_dispatcher(struct uprobe_consumer *con, struct pt_regs *regs)
1246
1244
esize = SIZEOF_TRACE_ENTRY (is_ret_probe (tu ));
1247
1245
1248
1246
ucb = uprobe_buffer_get ();
1247
+
1248
+ if (WARN_ON_ONCE (tu -> tp .size + dsize > MAX_UCB_BUFFER_SIZE )) {
1249
+ dsize = MAX_UCB_BUFFER_SIZE - tu -> tp .size ;
1250
+ }
1251
+
1249
1252
store_trace_args (esize , & tu -> tp , regs , ucb -> buf , dsize );
1250
1253
1251
1254
if (tu -> tp .flags & TP_FLAG_TRACE )
@@ -1281,6 +1284,11 @@ static int uretprobe_dispatcher(struct uprobe_consumer *con,
1281
1284
esize = SIZEOF_TRACE_ENTRY (is_ret_probe (tu ));
1282
1285
1283
1286
ucb = uprobe_buffer_get ();
1287
+
1288
+ if (WARN_ON_ONCE (tu -> tp .size + dsize > MAX_UCB_BUFFER_SIZE )) {
1289
+ dsize = MAX_UCB_BUFFER_SIZE - tu -> tp .size ;
1290
+ }
1291
+
1284
1292
store_trace_args (esize , & tu -> tp , regs , ucb -> buf , dsize );
1285
1293
1286
1294
if (tu -> tp .flags & TP_FLAG_TRACE )
0 commit comments