From b7bf03b161a3256921167114fe91d535bc13e073 Mon Sep 17 00:00:00 2001 From: nekral-guest Date: Mon, 16 Mar 2009 23:20:43 +0000 Subject: [PATCH] Added interposition library necessary for the failures tests. --- tests/common/Makefile | 4 +++ tests/common/rename_failure.c | 50 +++++++++++++++++++++++++++++++++++ 2 files changed, 54 insertions(+) create mode 100644 tests/common/Makefile create mode 100644 tests/common/rename_failure.c diff --git a/tests/common/Makefile b/tests/common/Makefile new file mode 100644 index 00000000..a69e6329 --- /dev/null +++ b/tests/common/Makefile @@ -0,0 +1,4 @@ +all: rename_failure.so + +rename_failure.so: rename_failure.c + gcc -W -Wall -pedantic -g $< -shared -ldl -o $@ diff --git a/tests/common/rename_failure.c b/tests/common/rename_failure.c new file mode 100644 index 00000000..dd02fe59 --- /dev/null +++ b/tests/common/rename_failure.c @@ -0,0 +1,50 @@ +/* + * gcc rename_failure.c -o rename_failure.so -shared -ldl + * LD_PRELOAD=./rename_failure.so FAILURE_PATH=/etc/shadow ./test /etc/shadow + */ + +#define _GNU_SOURCE +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + + +typedef int (*rename_type) (const char *old, const char *new); +static rename_type next_rename; + +static const char *failure_path = NULL; + +int rename (const char *old, const char *new) +{ + if (NULL == next_rename) + { + next_rename = dlsym (RTLD_NEXT, "rename"); + assert (NULL != next_rename); + } + if (NULL == failure_path) { + failure_path = getenv ("FAILURE_PATH"); + if (NULL == failure_path) { + fputs ("No FAILURE_PATH defined\n", stderr); + } + } + + if ( (NULL != new) + && (NULL != failure_path) + && (strcmp (new, failure_path) == 0)) + { + fprintf (stderr, "rename FAILURE %s %s\n", old, new); + errno = EIO; + return -1; + } + + return next_rename (old, new); +} +