summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Stenberg <daniel@haxx.se>2009-10-28 20:30:23 +0000
committerDaniel Stenberg <daniel@haxx.se>2009-10-28 20:30:23 +0000
commit6a79b0e8591ec94adcc49809bf1ab8cf66f1bb41 (patch)
treeb1b8b301d39caaee4e22277b84fbc52545d03b5d
parent0d9f14f5c17e4a3888dedbc8d568a55979fc05f0 (diff)
downloadgnurl-6a79b0e8591ec94adcc49809bf1ab8cf66f1bb41.tar.gz
gnurl-6a79b0e8591ec94adcc49809bf1ab8cf66f1bb41.tar.bz2
gnurl-6a79b0e8591ec94adcc49809bf1ab8cf66f1bb41.zip
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!
-rw-r--r--lib/memdebug.c12
-rw-r--r--lib/memdebug.h7
-rw-r--r--lib/nss.c1
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;
}
-/* this is our own defined way to close sockets on *ALL* platforms */
-int curl_sclose(int sockfd, int line, const char *source)
+/* separate function to allow libcurl to mark a "faked" close */
+int curl_mark_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);
+}
+
+/* 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);
+ 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);