From 9731516e7f87cc16412eb830840d0393e8a4f823 Mon Sep 17 00:00:00 2001 From: Andreas Schneider Date: Thu, 2 Oct 2014 07:18:48 +0200 Subject: [PATCH] swrap: Wrap fopen to detect stale file descriptors. Signed-off-by: Andreas Schneider Reviewed-by: Stefan Metzmacher --- lib/socket_wrapper/socket_wrapper.c | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/lib/socket_wrapper/socket_wrapper.c b/lib/socket_wrapper/socket_wrapper.c index 96490041c7a..574f5ba71af 100644 --- a/lib/socket_wrapper/socket_wrapper.c +++ b/lib/socket_wrapper/socket_wrapper.c @@ -337,6 +337,7 @@ struct swrap_libc_fns { socklen_t addrlen); int (*libc_dup)(int fd); int (*libc_dup2)(int oldfd, int newfd); + FILE *(*libc_fopen)(const char *name, const char *mode); #ifdef HAVE_EVENTFD int (*libc_eventfd)(int count, int flags); #endif @@ -645,6 +646,13 @@ static int libc_listen(int sockfd, int backlog) return swrap.fns.libc_listen(sockfd, backlog); } +static FILE *libc_fopen(const char *name, const char *mode) +{ + swrap_load_lib_function(SWRAP_LIBC, fopen); + + return swrap.fns.libc_fopen(name, mode); +} + static int libc_vopen(const char *pathname, int flags, va_list ap) { long int mode = 0; @@ -3066,6 +3074,29 @@ int listen(int s, int backlog) } /**************************************************************************** + * FOPEN + ***************************************************************************/ + +static FILE *swrap_fopen(const char *name, const char *mode) +{ + FILE *fp; + + fp = libc_fopen(name, mode); + if (fp != NULL) { + int fd = fileno(fp); + + swrap_remove_stale(fd); + } + + return fp; +} + +FILE *fopen(const char *name, const char *mode) +{ + return swrap_fopen(name, mode); +} + +/**************************************************************************** * OPEN ***************************************************************************/ -- 2.11.4.GIT