(root)/
strace-6.5/
tests-mx32/
prctl-set-ptracer-success.c
       1  /*
       2   * Check decoding of prctl PR_SET_PTRACER operation.
       3   *
       4   * Copyright (c) 2021 Eugene Syromyatnikov <evgsyr@gmail.com>
       5   * All rights reserved.
       6   *
       7   * SPDX-License-Identifier: GPL-2.0-or-later
       8   */
       9  
      10  #include "tests.h"
      11  #include "scno.h"
      12  
      13  #include <stdio.h>
      14  #include <stdlib.h>
      15  #include <unistd.h>
      16  #include <linux/prctl.h>
      17  
      18  #include "pidns.h"
      19  
      20  
      21  int
      22  main(int argc, char *argv[])
      23  {
      24  	PIDNS_TEST_INIT;
      25  
      26  	long rc;
      27  	unsigned long num_skip = 256;
      28  	bool locked = false;
      29  
      30  	if (argc >= 2)
      31  		num_skip = strtoul(argv[1], NULL, 0);
      32  
      33  	for (size_t i = 0; i < num_skip; i++) {
      34  		rc = prctl_marker();
      35  #ifdef PIDNS_TRANSLATION
      36  		const char *errstr = sprintrc(rc);
      37  		pidns_print_leader();
      38  		printf("prctl(" XLAT_UNKNOWN(0xffffffff, "PR_???")
      39  		       ", 0xfffffffe, 0xfffffffd, 0xfffffffc, 0xfffffffb) = ");
      40  
      41  		if (rc < 0) {
      42  			puts(errstr);
      43  		} else {
      44  			printf("%ld (INJECTED)\n", rc);
      45  		}
      46  #endif
      47  
      48  		if (rc < 0)
      49  			continue;
      50  
      51  		locked = true;
      52  		break;
      53  	}
      54  
      55  	rc = syscall(__NR_prctl, PR_SET_PTRACER, F8ILL_KULONG_MASK,
      56  		     0xdead, 0xface, 0xbeef);
      57  	pidns_print_leader();
      58  	printf("prctl(" XLAT_KNOWN(0x59616d61, "PR_SET_PTRACER")
      59  	       ", 0) = %s%s\n", sprintrc(rc), locked ? " (INJECTED)" : "");
      60  
      61  	rc = syscall(__NR_prctl, PR_SET_PTRACER,
      62  		     (kernel_ulong_t) 0xbadc0dedffffffffULL,
      63  		     0xdead, 0xface, 0xbeef);
      64  	pidns_print_leader();
      65  	printf("prctl(" XLAT_KNOWN(0x59616d61, "PR_SET_PTRACER") ", "
      66  	       XLAT_KNOWN(-1, "PR_SET_PTRACER_ANY") ") = %s%s\n",
      67  	       sprintrc(rc), locked ? " (INJECTED)" : "");
      68  
      69  	const int pid = getpid();
      70  	const char *pid_str = pidns_pid2str(PT_TGID);
      71  	rc = syscall(__NR_prctl, PR_SET_PTRACER, F8ILL_KULONG_MASK | pid,
      72  		     0xdead, 0xface, 0xbeef);
      73  	pidns_print_leader();
      74  	printf("prctl(" XLAT_KNOWN(0x59616d61, "PR_SET_PTRACER") ", %d%s)"
      75  	       " = %s%s\n",
      76  	       pid, pid_str, sprintrc(rc), locked ? " (INJECTED)" : "");
      77  
      78  	pidns_print_leader();
      79  	puts("+++ exited with 0 +++");
      80  	return 0;
      81  }