DEBUG_FD_LEAKS: Add missing FD creators.
authorCorey Farrell <git@cfware.com>
Wed, 8 Nov 2017 07:40:22 +0000 (02:40 -0500)
committerCorey Farrell <git@cfware.com>
Wed, 8 Nov 2017 18:57:45 +0000 (13:57 -0500)
This adds FD tracking for the following functions:
* eventfd
* timerfd_create
* socketpair
* accept

ASTERISK-27404

Change-Id: Id6848fe904ade2d34eb39d2a20bd6b223e1111fc

include/asterisk.h
main/astfd.c

index 899438b..9122e3a 100644 (file)
@@ -59,7 +59,9 @@
 
 #define        open(a,...)     __ast_fdleak_open(__FILE__,__LINE__,__PRETTY_FUNCTION__, a, __VA_ARGS__)
 #define pipe(a)                __ast_fdleak_pipe(a, __FILE__,__LINE__,__PRETTY_FUNCTION__)
+#define socketpair(a,b,c,d)    __ast_fdleak_socketpair(a, b, c, d, __FILE__,__LINE__,__PRETTY_FUNCTION__)
 #define socket(a,b,c)  __ast_fdleak_socket(a, b, c, __FILE__,__LINE__,__PRETTY_FUNCTION__)
+#define accept(a,b,c)  __ast_fdleak_accept(a, b, c, __FILE__,__LINE__,__PRETTY_FUNCTION__)
 #define close(a)       __ast_fdleak_close(a)
 #define        fopen(a,b)      __ast_fdleak_fopen(a, b, __FILE__,__LINE__,__PRETTY_FUNCTION__)
 #define        fclose(a)       __ast_fdleak_fclose(a)
@@ -71,7 +73,21 @@ extern "C" {
 #endif
 int __ast_fdleak_open(const char *file, int line, const char *func, const char *path, int flags, ...);
 int __ast_fdleak_pipe(int *fds, const char *file, int line, const char *func);
+int __ast_fdleak_socketpair(int domain, int type, int protocol, int sv[2],
+       const char *file, int line, const char *func);
 int __ast_fdleak_socket(int domain, int type, int protocol, const char *file, int line, const char *func);
+int __ast_fdleak_accept(int socket, struct sockaddr *address, socklen_t *address_len,
+       const char *file, int line, const char *func);
+#if defined(HAVE_EVENTFD)
+#include <sys/eventfd.h>
+#define eventfd(a,b)   __ast_fdleak_eventfd(a,b, __FILE__,__LINE__,__PRETTY_FUNCTION__)
+int __ast_fdleak_eventfd(unsigned int initval, int flags, const char *file, int line, const char *func);
+#endif
+#if defined(HAVE_TIMERFD)
+#include <sys/timerfd.h>
+#define timerfd_create(a,b)    __ast_fdleak_timerfd_create(a,b, __FILE__,__LINE__,__PRETTY_FUNCTION__)
+int __ast_fdleak_timerfd_create(int clockid, int flags, const char *file, int line, const char *func);
+#endif
 int __ast_fdleak_close(int fd);
 FILE *__ast_fdleak_fopen(const char *path, const char *mode, const char *file, int line, const char *func);
 int __ast_fdleak_fclose(FILE *ptr);
index 34cf7bb..e29361e 100644 (file)
@@ -132,6 +132,19 @@ int __ast_fdleak_open(const char *file, int line, const char *func, const char *
        return res;
 }
 
+#undef accept
+int __ast_fdleak_accept(int socket, struct sockaddr *address, socklen_t *address_len,
+       const char *file, int line, const char *func)
+{
+       int res = accept(socket, address, address_len);
+
+       if (res >= 0) {
+               STORE_COMMON(res, "accept", "{%d}", socket);
+       }
+
+       return res;
+}
+
 #undef pipe
 int __ast_fdleak_pipe(int *fds, const char *file, int line, const char *func)
 {
@@ -147,6 +160,52 @@ int __ast_fdleak_pipe(int *fds, const char *file, int line, const char *func)
        return 0;
 }
 
+#undef socketpair
+int __ast_fdleak_socketpair(int domain, int type, int protocol, int sv[2],
+       const char *file, int line, const char *func)
+{
+       int i, res = socketpair(domain, type, protocol, sv);
+       if (res) {
+               return res;
+       }
+       for (i = 0; i < 2; i++) {
+               if (sv[i] > -1 && sv[i] < ARRAY_LEN(fdleaks)) {
+                       STORE_COMMON(sv[i], "socketpair", "{%d,%d}", sv[0], sv[1]);
+               }
+       }
+       return 0;
+}
+
+#if defined(HAVE_EVENTFD)
+#undef eventfd
+#include <sys/eventfd.h>
+int __ast_fdleak_eventfd(unsigned int initval, int flags, const char *file, int line, const char *func)
+{
+       int res = eventfd(initval, flags);
+
+       if (res >= 0) {
+               STORE_COMMON(res, "eventfd", "{%d}", res);
+       }
+
+       return res;
+}
+#endif
+
+#if defined(HAVE_TIMERFD)
+#undef timerfd_create
+#include <sys/timerfd.h>
+int __ast_fdleak_timerfd_create(int clockid, int flags, const char *file, int line, const char *func)
+{
+       int res = timerfd_create(clockid, flags);
+
+       if (res >= 0) {
+               STORE_COMMON(res, "timerfd_create", "{%d}", res);
+       }
+
+       return res;
+}
+#endif
+
 #undef socket
 int __ast_fdleak_socket(int domain, int type, int protocol, const char *file, int line, const char *func)
 {