@@ -239,23 +239,166 @@ static void test_attach_api_fails(void)
239
239
LIBBPF_OPTS (bpf_link_create_opts , opts );
240
240
const char * path = "/proc/self/exe" ;
241
241
struct uprobe_multi * skel = NULL ;
242
+ int prog_fd , link_fd = -1 ;
242
243
unsigned long offset = 0 ;
243
- int link_fd = -1 ;
244
244
245
245
skel = uprobe_multi__open_and_load ();
246
246
if (!ASSERT_OK_PTR (skel , "uprobe_multi__open_and_load" ))
247
247
goto cleanup ;
248
248
249
+ prog_fd = bpf_program__fd (skel -> progs .uprobe_extra );
250
+
249
251
/* abnormal cnt */
250
252
opts .uprobe_multi .path = path ;
251
253
opts .uprobe_multi .offsets = & offset ;
252
254
opts .uprobe_multi .cnt = INT_MAX ;
253
- link_fd = bpf_link_create (bpf_program__fd (skel -> progs .uprobe ), 0 ,
254
- BPF_TRACE_UPROBE_MULTI , & opts );
255
+ link_fd = bpf_link_create (prog_fd , 0 , BPF_TRACE_UPROBE_MULTI , & opts );
255
256
if (!ASSERT_ERR (link_fd , "link_fd" ))
256
257
goto cleanup ;
257
258
if (!ASSERT_EQ (link_fd , - E2BIG , "big cnt" ))
258
259
goto cleanup ;
260
+
261
+ /* cnt is 0 */
262
+ LIBBPF_OPTS_RESET (opts ,
263
+ .uprobe_multi .path = path ,
264
+ .uprobe_multi .offsets = (unsigned long * ) & offset ,
265
+ );
266
+
267
+ link_fd = bpf_link_create (prog_fd , 0 , BPF_TRACE_UPROBE_MULTI , & opts );
268
+ if (!ASSERT_ERR (link_fd , "link_fd" ))
269
+ goto cleanup ;
270
+ if (!ASSERT_EQ (link_fd , - EINVAL , "cnt_is_zero" ))
271
+ goto cleanup ;
272
+
273
+ /* negative offset */
274
+ offset = -1 ;
275
+ opts .uprobe_multi .path = path ;
276
+ opts .uprobe_multi .offsets = (unsigned long * ) & offset ;
277
+ opts .uprobe_multi .cnt = 1 ;
278
+
279
+ link_fd = bpf_link_create (prog_fd , 0 , BPF_TRACE_UPROBE_MULTI , & opts );
280
+ if (!ASSERT_ERR (link_fd , "link_fd" ))
281
+ goto cleanup ;
282
+ if (!ASSERT_EQ (link_fd , - EINVAL , "offset_is_negative" ))
283
+ goto cleanup ;
284
+
285
+ /* offsets is NULL */
286
+ LIBBPF_OPTS_RESET (opts ,
287
+ .uprobe_multi .path = path ,
288
+ .uprobe_multi .cnt = 1 ,
289
+ );
290
+
291
+ link_fd = bpf_link_create (prog_fd , 0 , BPF_TRACE_UPROBE_MULTI , & opts );
292
+ if (!ASSERT_ERR (link_fd , "link_fd" ))
293
+ goto cleanup ;
294
+ if (!ASSERT_EQ (link_fd , - EINVAL , "offsets_is_null" ))
295
+ goto cleanup ;
296
+
297
+ /* wrong offsets pointer */
298
+ LIBBPF_OPTS_RESET (opts ,
299
+ .uprobe_multi .path = path ,
300
+ .uprobe_multi .offsets = (unsigned long * ) 1 ,
301
+ .uprobe_multi .cnt = 1 ,
302
+ );
303
+
304
+ link_fd = bpf_link_create (prog_fd , 0 , BPF_TRACE_UPROBE_MULTI , & opts );
305
+ if (!ASSERT_ERR (link_fd , "link_fd" ))
306
+ goto cleanup ;
307
+ if (!ASSERT_EQ (link_fd , - EFAULT , "offsets_is_wrong" ))
308
+ goto cleanup ;
309
+
310
+ /* path is NULL */
311
+ offset = 1 ;
312
+ LIBBPF_OPTS_RESET (opts ,
313
+ .uprobe_multi .offsets = (unsigned long * ) & offset ,
314
+ .uprobe_multi .cnt = 1 ,
315
+ );
316
+
317
+ link_fd = bpf_link_create (prog_fd , 0 , BPF_TRACE_UPROBE_MULTI , & opts );
318
+ if (!ASSERT_ERR (link_fd , "link_fd" ))
319
+ goto cleanup ;
320
+ if (!ASSERT_EQ (link_fd , - EINVAL , "path_is_null" ))
321
+ goto cleanup ;
322
+
323
+ /* wrong path pointer */
324
+ LIBBPF_OPTS_RESET (opts ,
325
+ .uprobe_multi .path = (const char * ) 1 ,
326
+ .uprobe_multi .offsets = (unsigned long * ) & offset ,
327
+ .uprobe_multi .cnt = 1 ,
328
+ );
329
+
330
+ link_fd = bpf_link_create (prog_fd , 0 , BPF_TRACE_UPROBE_MULTI , & opts );
331
+ if (!ASSERT_ERR (link_fd , "link_fd" ))
332
+ goto cleanup ;
333
+ if (!ASSERT_EQ (link_fd , - EFAULT , "path_is_wrong" ))
334
+ goto cleanup ;
335
+
336
+ /* wrong path type */
337
+ LIBBPF_OPTS_RESET (opts ,
338
+ .uprobe_multi .path = "/" ,
339
+ .uprobe_multi .offsets = (unsigned long * ) & offset ,
340
+ .uprobe_multi .cnt = 1 ,
341
+ );
342
+
343
+ link_fd = bpf_link_create (prog_fd , 0 , BPF_TRACE_UPROBE_MULTI , & opts );
344
+ if (!ASSERT_ERR (link_fd , "link_fd" ))
345
+ goto cleanup ;
346
+ if (!ASSERT_EQ (link_fd , - EBADF , "path_is_wrong_type" ))
347
+ goto cleanup ;
348
+
349
+ /* wrong cookies pointer */
350
+ LIBBPF_OPTS_RESET (opts ,
351
+ .uprobe_multi .path = path ,
352
+ .uprobe_multi .offsets = (unsigned long * ) & offset ,
353
+ .uprobe_multi .cookies = (__u64 * ) 1ULL ,
354
+ .uprobe_multi .cnt = 1 ,
355
+ );
356
+
357
+ link_fd = bpf_link_create (prog_fd , 0 , BPF_TRACE_UPROBE_MULTI , & opts );
358
+ if (!ASSERT_ERR (link_fd , "link_fd" ))
359
+ goto cleanup ;
360
+ if (!ASSERT_EQ (link_fd , - EFAULT , "cookies_is_wrong" ))
361
+ goto cleanup ;
362
+
363
+ /* wrong ref_ctr_offsets pointer */
364
+ LIBBPF_OPTS_RESET (opts ,
365
+ .uprobe_multi .path = path ,
366
+ .uprobe_multi .offsets = (unsigned long * ) & offset ,
367
+ .uprobe_multi .cookies = (__u64 * ) & offset ,
368
+ .uprobe_multi .ref_ctr_offsets = (unsigned long * ) 1 ,
369
+ .uprobe_multi .cnt = 1 ,
370
+ );
371
+
372
+ link_fd = bpf_link_create (prog_fd , 0 , BPF_TRACE_UPROBE_MULTI , & opts );
373
+ if (!ASSERT_ERR (link_fd , "link_fd" ))
374
+ goto cleanup ;
375
+ if (!ASSERT_EQ (link_fd , - EFAULT , "ref_ctr_offsets_is_wrong" ))
376
+ goto cleanup ;
377
+
378
+ /* wrong flags */
379
+ LIBBPF_OPTS_RESET (opts ,
380
+ .uprobe_multi .flags = 1 << 31 ,
381
+ );
382
+
383
+ link_fd = bpf_link_create (prog_fd , 0 , BPF_TRACE_UPROBE_MULTI , & opts );
384
+ if (!ASSERT_ERR (link_fd , "link_fd" ))
385
+ goto cleanup ;
386
+ if (!ASSERT_EQ (link_fd , - EINVAL , "wrong_flags" ))
387
+ goto cleanup ;
388
+
389
+ /* wrong pid */
390
+ LIBBPF_OPTS_RESET (opts ,
391
+ .uprobe_multi .path = path ,
392
+ .uprobe_multi .offsets = (unsigned long * ) & offset ,
393
+ .uprobe_multi .cnt = 1 ,
394
+ .uprobe_multi .pid = -2 ,
395
+ );
396
+
397
+ link_fd = bpf_link_create (prog_fd , 0 , BPF_TRACE_UPROBE_MULTI , & opts );
398
+ if (!ASSERT_ERR (link_fd , "link_fd" ))
399
+ goto cleanup ;
400
+ ASSERT_EQ (link_fd , - ESRCH , "pid_is_wrong" );
401
+
259
402
cleanup :
260
403
if (link_fd >= 0 )
261
404
close (link_fd );
0 commit comments