| /* |
| * Copyright (c) 2012 The Chromium OS Authors. |
| * |
| * Based on: |
| * http://bazaar.launchpad.net/~ubuntu-bugcontrol/qa-regression-testing/master/view/head:/scripts/kernel-security/ptrace/sleeper.c |
| * Copyright 2010 Canonical, Ltd |
| * License: GPLv3 |
| * Author: Kees Cook <kees.cook@canonical.com> |
| */ |
| #define _GNU_SOURCE |
| #include <stdio.h> |
| #include <stdlib.h> |
| #include <unistd.h> |
| #include <stdint.h> |
| #include <string.h> |
| #include <stdint.h> |
| #include <stddef.h> |
| #include <inttypes.h> |
| #include <sys/types.h> |
| #include <sys/stat.h> |
| #include <fcntl.h> |
| #include <sys/prctl.h> |
| #include <signal.h> |
| |
| #ifndef PR_SET_PTRACER |
| #define PR_SET_PTRACER 0x59616d61 |
| #endif |
| |
| int main(int argc, char* argv[]) { |
| long pid; |
| |
| if (argc < 3) { |
| fprintf(stderr, "Usage: %s TRACER_PID SLEEP_SECONDS\n", argv[0]); |
| /* Without arguments, send a SIGINT to ourself so that gdb can |
| * regain control without needing debugging symbols. |
| */ |
| kill(getpid(), SIGINT); |
| return 1; |
| } |
| |
| pid = strtol(argv[1], NULL, 10); |
| if (pid != -2) { |
| if (prctl(PR_SET_PTRACER, pid, 0, 0, 0)) { |
| perror("prctl"); |
| puts("failed"); |
| return 1; |
| } |
| } |
| |
| puts("ready"); |
| fflush(NULL); |
| sleep(atoi(argv[2])); |
| |
| return 0; |
| } |