Commit 6a79b0e8 authored by Daniel Stenberg's avatar Daniel Stenberg
Browse files

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!
parent 0d9f14f5
Loading
Loading
Loading
Loading
+9 −3
Original line number Diff line number Diff line
@@ -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;
}

+7 −0
Original line number Diff line number Diff line
@@ -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
+1 −0
Original line number Diff line number Diff line
@@ -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);