/*
* 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;
}