commit 2e4a52504c97635fd030078cab7c73ac58980cda Author: whaffman Date: Sun Jan 19 15:55:55 2025 +0100 initial diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..abdcf15 --- /dev/null +++ b/Makefile @@ -0,0 +1,54 @@ +# **************************************************************************** # +# # +# ::: o_ :::::: ::: # +# Makefile :+: / :+::+: :+: # +# +:+ > +:++:+ +:+ # +# By: whaffman +#+ +:+ +#++#++:++#++ # +# +#+ +#+#+ +#++#+ +#+ \o/ # +# Created: 2024/10/15 11:48:46 by whaffman #+#+# #+#+# #+# #+# | # +# Updated: 2024/11/07 15:28:08 by whaffman ### ### ### ### / \ # +# # +# **************************************************************************** # + +NAME = funfail.so + +SRC_PATH = src +INC_PATH = inc +OBJ_PATH = obj + +VPATH = src:src/utils +SOURCES = $(shell basename -a $(shell find $(SRC_PATH) -type f -name "*.c")) +OBJECTS = $(addprefix $(OBJ_PATH)/, $(SOURCES:.c=.o)) +DEPENDS = ${OBJECTS:.o=.d} + +CC = cc +RM = rm -rf + +INCLUDES = -I./$(INC_PATH) +CFLAGS = -Wall -Wextra -Werror -MMD +LDLIBS = -fPIC -shared -ldl + + + +all: $(NAME) + +$(NAME): $(OBJECTS) + $(CC) $(CFLAGS) $(OBJECTS) $(LDLIBS) -o $(NAME) + +-include ${DEPENDS} + +$(OBJ_PATH): + mkdir -p $@ + +$(OBJ_PATH)/%.o: %.c | $(OBJ_PATH) + $(CC) $(CFLAGS) $(INCLUDES) -c $< -o $@ + +clean: + $(RM) $(OBJECTS) $(OBJ_PATH) + +fclean: clean + $(RM) $(NAME) + +re: fclean all + +.PHONY: all clean fclean re diff --git a/funfail.so b/funfail.so new file mode 100755 index 0000000..de5d003 Binary files /dev/null and b/funfail.so differ diff --git a/obj/calloc.d b/obj/calloc.d new file mode 100644 index 0000000..ec240d8 --- /dev/null +++ b/obj/calloc.d @@ -0,0 +1 @@ +obj/calloc.o: src/calloc.c diff --git a/obj/calloc.o b/obj/calloc.o new file mode 100644 index 0000000..e534ae3 Binary files /dev/null and b/obj/calloc.o differ diff --git a/obj/malloc.d b/obj/malloc.d new file mode 100644 index 0000000..2783f3d --- /dev/null +++ b/obj/malloc.d @@ -0,0 +1 @@ +obj/malloc.o: src/malloc.c diff --git a/obj/malloc.o b/obj/malloc.o new file mode 100644 index 0000000..7e53e45 Binary files /dev/null and b/obj/malloc.o differ diff --git a/obj/read.d b/obj/read.d new file mode 100644 index 0000000..439b460 --- /dev/null +++ b/obj/read.d @@ -0,0 +1 @@ +obj/read.o: src/read.c diff --git a/obj/read.o b/obj/read.o new file mode 100644 index 0000000..b02f7b9 Binary files /dev/null and b/obj/read.o differ diff --git a/obj/write.d b/obj/write.d new file mode 100644 index 0000000..d245ad8 --- /dev/null +++ b/obj/write.d @@ -0,0 +1 @@ +obj/write.o: src/write.c diff --git a/obj/write.o b/obj/write.o new file mode 100644 index 0000000..248ee28 Binary files /dev/null and b/obj/write.o differ diff --git a/src/calloc.c b/src/calloc.c new file mode 100644 index 0000000..8a6ade6 --- /dev/null +++ b/src/calloc.c @@ -0,0 +1,25 @@ +#include +#include +#include + +typedef void *(*f)(size_t __nmemb, size_t __size); + +void *calloc(size_t __nmemb, size_t __size) +{ + static f og_calloc = NULL; + static int calls = 0; + const int MAX_CALLS = getenv("MAX_CALLOC_CALLS") ? atoi(getenv("MAX_CALLOC_CALLS")) : -1; + + if (!og_calloc) + { + og_calloc = (f)dlsym(RTLD_NEXT, "calloc"); + } + + calls++; + if (MAX_CALLS < 0 || calls <= MAX_CALLS) + { + return og_calloc(__nmemb, __size); + } + errno = ENOMEM; + return NULL; +} \ No newline at end of file diff --git a/src/malloc.c b/src/malloc.c new file mode 100644 index 0000000..238caec --- /dev/null +++ b/src/malloc.c @@ -0,0 +1,23 @@ +#include +#include +#include + + +typedef void* (*f)(size_t size); + +void* malloc(size_t size) { + static f og_malloc = NULL; + static int calls = 0; + const int MAX_CALLS = getenv("MAX_MALLOC_CALLS") ? atoi(getenv("MAX_MALLOC_CALLS")) : -1; + + if (!og_malloc) { + og_malloc = (f)dlsym(RTLD_NEXT, "malloc"); + } + + calls++; + if (MAX_CALLS < 0 || calls <= MAX_CALLS) { + return og_malloc(size); + } + errno = ENOMEM; + return NULL; +} \ No newline at end of file diff --git a/src/read.c b/src/read.c new file mode 100644 index 0000000..e69de29 diff --git a/src/write.c b/src/write.c new file mode 100644 index 0000000..6e912cf --- /dev/null +++ b/src/write.c @@ -0,0 +1,26 @@ +#include +#include +#include +#include + +typedef ssize_t (*f)(int fd, const void *buf, size_t count); + +ssize_t write(int fd, const void *buf, size_t count) +{ + static f og_write = NULL; + static int calls = 0; + const int MAX_CALLS = getenv("MAX_WRITE_CALLS") ? atoi(getenv("MAX_WRITE_CALLS")) : -1; + + if (!og_write) + { + og_write = (f)dlsym(RTLD_NEXT, "write"); + } + + calls++; + if (MAX_CALLS < 0 || calls <= MAX_CALLS) + { + return og_write(fd, buf, count); + } + errno = EBADF; + return -1; +} \ No newline at end of file