From 6a79b0e8591ec94adcc49809bf1ab8cf66f1bb41 Mon Sep 17 00:00:00 2001 From: Daniel Stenberg Date: Wed, 28 Oct 2009 20:30:23 +0000 Subject: [PATCH] Since the NSS lib closes the socket the memory tracking system wrongly gets a false positive on a leaked socket, so this introduces a way to tell the system that the socket is indeed closed without explicitly closing it! --- lib/memdebug.c | 12 +++++++++--- lib/memdebug.h | 7 +++++++ lib/nss.c | 1 + 3 files changed, 17 insertions(+), 3 deletions(-) diff --git a/lib/memdebug.c b/lib/memdebug.c index 3a0cf7153..ea3eb8559 100644 --- a/lib/memdebug.c +++ b/lib/memdebug.c @@ -263,13 +263,19 @@ int curl_accept(int s, void *saddr, void *saddrlen, return sockfd; } +/* separate function to allow libcurl to mark a "faked" close */ +int curl_mark_sclose(int sockfd, int line, const char *source) +{ + if(logfile) + fprintf(logfile, "FD %s:%d sclose(%d)\n", + source, line, sockfd); +} + /* this is our own defined way to close sockets on *ALL* platforms */ int curl_sclose(int sockfd, int line, const char *source) { int res=sclose(sockfd); - if(logfile) - fprintf(logfile, "FD %s:%d sclose(%d)\n", - source, line, sockfd); + curl_mark_sclose(sockfd, line, source); return res; } diff --git a/lib/memdebug.h b/lib/memdebug.h index 6e7e8d7f2..57e89b1d4 100644 --- a/lib/memdebug.h +++ b/lib/memdebug.h @@ -57,6 +57,7 @@ CURL_EXTERN void curl_memlimit(long limit); /* file descriptor manipulators */ CURL_EXTERN int curl_socket(int domain, int type, int protocol, int line , const char *); +CURL_EXTERN int curl_mark_sclose(int sockfd, int, const char *source); CURL_EXTERN int curl_sclose(int sockfd, int, const char *source); CURL_EXTERN int curl_accept(int s, void *addr, void *addrlen, int line, const char *source); @@ -117,6 +118,8 @@ CURL_EXTERN int curl_fclose(FILE *file, int line, const char *source); #undef sclose #define sclose(sockfd) curl_sclose(sockfd,__LINE__,__FILE__) +#define fake_sclose(sockfd) curl_mark_sclose(sockfd,__LINE__,__FILE__) + #undef fopen #define fopen(file,mode) curl_fopen(file,mode,__LINE__,__FILE__) #undef fdopen @@ -127,3 +130,7 @@ CURL_EXTERN int curl_fclose(FILE *file, int line, const char *source); #endif /* _CURL_MEMDEBUG_H */ #endif /* CURLDEBUG */ + +#ifndef fake_sclose +#define fake_sclose(x) +#endif diff --git a/lib/nss.c b/lib/nss.c index 866b1d0c8..7408585da 100644 --- a/lib/nss.c +++ b/lib/nss.c @@ -930,6 +930,7 @@ void Curl_nss_close(struct connectdata *conn, int sockindex) /* NSS closes the socket we previously handed to it, so we must mark it as closed to avoid double close */ + fake_sclose(conn->sock[sockindex]); conn->sock[sockindex] = CURL_SOCKET_BAD; if(connssl->client_nickname != NULL) { free(connssl->client_nickname);