made script and finished for read write malloc and calloc
This commit is contained in:
parent
8cb9e873a9
commit
b8e31ab825
57
funfail.sh
Executable file
57
funfail.sh
Executable file
@ -0,0 +1,57 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Check if funfail.so exists, else make it
|
||||||
|
if [ ! -f ./funfail.so ]; then
|
||||||
|
echo "funfail.so not found, attempting to build it..."
|
||||||
|
make || { echo "Build failed. Exiting."; exit 1; }
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Function to display the menu
|
||||||
|
display_menu() {
|
||||||
|
echo "Select the function to fail:"
|
||||||
|
echo "1) malloc"
|
||||||
|
echo "2) calloc"
|
||||||
|
echo "3) read"
|
||||||
|
echo "4) write"
|
||||||
|
echo "5) exit"
|
||||||
|
echo -n "Enter your choice [1-5]: "
|
||||||
|
}
|
||||||
|
|
||||||
|
# Function to get the number of calls after which the function should fail
|
||||||
|
get_fail_after_calls() {
|
||||||
|
echo -n "Enter the number of calls after which the function should fail: "
|
||||||
|
read fail_after_calls
|
||||||
|
if ! [[ "$fail_after_calls" =~ ^[0-9]+$ ]] || [ "$fail_after_calls" -le 0 ]; then
|
||||||
|
echo "Invalid input. Please enter a positive integer."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Display the menu and get user input
|
||||||
|
display_menu
|
||||||
|
read choice
|
||||||
|
|
||||||
|
# Get the number of calls after which the function should fail
|
||||||
|
get_fail_after_calls
|
||||||
|
|
||||||
|
# Set the environment variables based on user input
|
||||||
|
case $choice in
|
||||||
|
1) export FAIL_FUNC="malloc" ;;
|
||||||
|
2) export FAIL_FUNC="calloc" ;;
|
||||||
|
3) export FAIL_FUNC="read" ;;
|
||||||
|
4) export FAIL_FUNC="write" ;;
|
||||||
|
5) exit 0 ;;
|
||||||
|
*) echo "Invalid choice"; exit 1 ;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
|
||||||
|
# Set the specific environment variable for the chosen function
|
||||||
|
case $FAIL_FUNC in
|
||||||
|
"malloc") export MAX_MALLOC_CALLS=$fail_after_calls ;;
|
||||||
|
"calloc") export MAX_CALLOC_CALLS=$fail_after_calls ;;
|
||||||
|
"read") export MAX_READ_CALLS=$fail_after_calls ;;
|
||||||
|
"write") export MAX_WRITE_CALLS=$fail_after_calls ;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
# Run the user program with its arguments while preloading funfail.so
|
||||||
|
LD_PRELOAD=./funfail.so "$@"
|
||||||
26
src/read.c
26
src/read.c
@ -0,0 +1,26 @@
|
|||||||
|
#include <dlfcn.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
typedef ssize_t (*f)(int fd, void *buf, size_t count);
|
||||||
|
|
||||||
|
ssize_t read(int fd, void *buf, size_t count)
|
||||||
|
{
|
||||||
|
static f og_read = NULL;
|
||||||
|
static int calls = 0;
|
||||||
|
const int MAX_CALLS = getenv("MAX_READ_CALLS") ? atoi(getenv("MAX_READ_CALLS")) : -1;
|
||||||
|
|
||||||
|
if (!og_read)
|
||||||
|
{
|
||||||
|
og_read = (f)dlsym(RTLD_NEXT, "read");
|
||||||
|
}
|
||||||
|
|
||||||
|
calls++;
|
||||||
|
if (MAX_CALLS < 0 || calls <= MAX_CALLS)
|
||||||
|
{
|
||||||
|
return og_read(fd, buf, count);
|
||||||
|
}
|
||||||
|
errno = EBADF;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue
Block a user