diff options
| author | Daniel Stenberg <daniel@haxx.se> | 2017-10-10 16:56:35 +0200 | 
|---|---|---|
| committer | Daniel Stenberg <daniel@haxx.se> | 2017-10-14 17:40:12 +0200 | 
| commit | ad164eceb3ce6721d34a3418e0dacabd4f4ff904 (patch) | |
| tree | 7ae3bdc1411b57b96b68a9a0ccef16904ec22c98 | |
| parent | 4af3c777a9996f32c5a23db0ecf29996197dfdbc (diff) | |
memdebug: trace send, recv and socket
... to allow them to be included in torture tests too.
closes #1980
| -rw-r--r-- | lib/memdebug.c | 33 | ||||
| -rw-r--r-- | lib/memdebug.h | 10 | ||||
| -rw-r--r-- | lib/openldap.c | 4 | ||||
| -rwxr-xr-x | tests/memanalyze.pl | 30 | ||||
| -rwxr-xr-x | tests/runtests.pl | 14 | 
5 files changed, 73 insertions, 18 deletions
diff --git a/lib/memdebug.c b/lib/memdebug.c index 0eb249ce9..8e61aba71 100644 --- a/lib/memdebug.c +++ b/lib/memdebug.c @@ -343,7 +343,12 @@ curl_socket_t curl_socket(int domain, int type, int protocol,      "FD %s:%d socket() = %ld\n" :      "FD %s:%d socket() = %zd\n"; -  curl_socket_t sockfd = socket(domain, type, protocol); +  curl_socket_t sockfd; + +  if(countcheck("socket", line, source)) +    return CURL_SOCKET_BAD; + +  sockfd = socket(domain, type, protocol);    if(source && (sockfd != CURL_SOCKET_BAD))      curl_memlog(fmt, source, line, sockfd); @@ -351,6 +356,32 @@ curl_socket_t curl_socket(int domain, int type, int protocol,    return sockfd;  } +ssize_t curl_dosend(int sockfd, const void *buf, size_t len, int flags, +                    int line, const char *source) +{ +  ssize_t rc; +  if(countcheck("send", line, source)) +    return -1; +  rc = send(sockfd, buf, len, flags); +  if(source) +    curl_memlog("SEND %s:%d send(%zu) = %zd\n", +                source, line, len, rc); +  return rc; +} + +ssize_t curl_dorecv(int sockfd, void *buf, size_t len, int flags, +                    int line, const char *source) +{ +  ssize_t rc; +  if(countcheck("recv", line, source)) +    return -1; +  rc = recv(sockfd, buf, len, flags); +  if(source) +    curl_memlog("RECV %s:%d recv(%zu) = %zd\n", +                source, line, len, rc); +  return rc; +} +  #ifdef HAVE_SOCKETPAIR  int curl_socketpair(int domain, int type, int protocol,                      curl_socket_t socket_vector[2], diff --git a/lib/memdebug.h b/lib/memdebug.h index 835dab38c..c6b9225f4 100644 --- a/lib/memdebug.h +++ b/lib/memdebug.h @@ -8,7 +8,7 @@   *                            | (__| |_| |  _ <| |___   *                             \___|\___/|_| \_\_____|   * - * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al. + * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.   *   * This software is licensed as described in the file COPYING, which   * you should have received as part of this distribution. The terms @@ -66,6 +66,12 @@ CURL_EXTERN int curl_socketpair(int domain, int type, int protocol,                                  int line, const char *source);  #endif +/* send/receive sockets */ +CURL_EXTERN ssize_t curl_dosend(int sockfd, const void *buf, size_t len, +                                int flags, int line, const char *source); +CURL_EXTERN ssize_t curl_dorecv(int sockfd, void *buf, size_t len, int flags, +                                int line, const char *source); +  /* FILE functions */  CURL_EXTERN FILE *curl_fopen(const char *file, const char *mode, int line,                               const char *source); @@ -84,6 +90,8 @@ CURL_EXTERN int curl_fclose(FILE *file, int line, const char *source);  #define calloc(nbelem,size) curl_docalloc(nbelem, size, __LINE__, __FILE__)  #define realloc(ptr,size) curl_dorealloc(ptr, size, __LINE__, __FILE__)  #define free(ptr) curl_dofree(ptr, __LINE__, __FILE__) +#define send(a,b,c,d) curl_dosend(a,b,c,d, __LINE__, __FILE__) +#define recv(a,b,c,d) curl_dorecv(a,b,c,d, __LINE__, __FILE__)  #ifdef WIN32  #  ifdef UNICODE diff --git a/lib/openldap.c b/lib/openldap.c index f2944033b..ac356d098 100644 --- a/lib/openldap.c +++ b/lib/openldap.c @@ -677,7 +677,7 @@ ldapsb_tls_read(Sockbuf_IO_Desc *sbiod, void *buf, ber_len_t len)    ber_slen_t ret;    CURLcode err = CURLE_RECV_ERROR; -  ret = li->recv(conn, FIRSTSOCKET, buf, len, &err); +  ret = (li->recv)(conn, FIRSTSOCKET, buf, len, &err);    if(ret < 0 && err == CURLE_AGAIN) {      SET_SOCKERRNO(EWOULDBLOCK);    } @@ -692,7 +692,7 @@ ldapsb_tls_write(Sockbuf_IO_Desc *sbiod, void *buf, ber_len_t len)    ber_slen_t ret;    CURLcode err = CURLE_SEND_ERROR; -  ret = li->send(conn, FIRSTSOCKET, buf, len, &err); +  ret = (li->send)(conn, FIRSTSOCKET, buf, len, &err);    if(ret < 0 && err == CURLE_AGAIN) {      SET_SOCKERRNO(EWOULDBLOCK);    } diff --git a/tests/memanalyze.pl b/tests/memanalyze.pl index 35d1c7ef7..8ba3f6dd5 100755 --- a/tests/memanalyze.pl +++ b/tests/memanalyze.pl @@ -6,7 +6,7 @@  #                            | (__| |_| |  _ <| |___  #                             \___|\___/|_| \_\_____|  # -# Copyright (C) 1998 - 2013, Daniel Stenberg, <daniel@haxx.se>, et al. +# Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.  #  # This software is licensed as described in the file COPYING, which  # you should have received as part of this distribution. The terms @@ -33,6 +33,9 @@ my $reallocs=0;  my $strdups=0;  my $wcsdups=0;  my $showlimit; +my $sends=0; +my $recvs=0; +my $sockets=0;  while(1) {      if($ARGV[0] eq "-v") { @@ -258,6 +261,7 @@ while(<FILE>) {              $filedes{$1}=1;              $getfile{$1}="$source:$linenum";              $openfile++; +            $sockets++; # number of socket() calls          }          elsif($function =~ /socketpair\(\) = (\d*) (\d*)/) {              $filedes{$1}=1; @@ -314,6 +318,14 @@ while(<FILE>) {      elsif($_ =~ /^GETNAME ([^ ]*):(\d*) (.*)/) {          # not much to do      } +    # SEND url.c:1901 send(83) = 83 +    elsif($_ =~ /^SEND ([^ ]*):(\d*) (.*)/) { +        $sends++; +    } +    # RECV url.c:1901 recv(102400) = 256 +    elsif($_ =~ /^RECV ([^ ]*):(\d*) (.*)/) { +        $recvs++; +    }      # ADDR url.c:1282 getaddrinfo() = 0x5ddd      elsif($_ =~ /^ADDR ([^ ]*):(\d*) (.*)/) { @@ -398,12 +410,16 @@ if($addrinfos) {  if($verbose) {      print "Mallocs: $mallocs\n", -    "Reallocs: $reallocs\n", -    "Callocs: $callocs\n", -    "Strdups:  $strdups\n", -    "Wcsdups:  $wcsdups\n", -    "Frees: $frees\n", -    "Allocations: ".($mallocs + $callocs + $reallocs + $strdups + $wcsdups)."\n"; +        "Reallocs: $reallocs\n", +        "Callocs: $callocs\n", +        "Strdups:  $strdups\n", +        "Wcsdups:  $wcsdups\n", +        "Frees: $frees\n", +        "Sends: $sends\n", +        "Recvs: $recvs\n", +        "Sockets: $sockets\n", +        "Allocations: ".($mallocs + $callocs + $reallocs + $strdups + $wcsdups)."\n", +        "Operations: ".($mallocs + $callocs + $reallocs + $strdups + $wcsdups + $sends + $recvs + $sockets)."\n";      print "Maximum allocated: $maxmem\n";  } diff --git a/tests/runtests.pl b/tests/runtests.pl index 44fd0ae93..39362e0b8 100755 --- a/tests/runtests.pl +++ b/tests/runtests.pl @@ -576,17 +576,17 @@ sub torture {      my $count=0;      my @out = `$memanalyze -v $memdump`;      for(@out) { -        if(/^Allocations: (\d+)/) { +        if(/^Operations: (\d+)/) {              $count = $1;              last;          }      }      if(!$count) { -        logmsg " found no allocs to make fail\n"; +        logmsg " found no functions to make fail\n";          return 0;      } -    logmsg " $count allocations to make fail\n"; +    logmsg " $count functions to make fail\n";      for ( 1 .. $count ) {          my $limit = $_; @@ -601,7 +601,7 @@ sub torture {              my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) =                  localtime(time());              my $now = sprintf("%02d:%02d:%02d ", $hour, $min, $sec); -            logmsg "Fail alloc no: $limit at $now\r"; +            logmsg "Fail funcion no: $limit at $now\r";          }          # make the memory allocation function number $limit return failure @@ -610,7 +610,7 @@ sub torture {          # remove memdump first to be sure we get a new nice and clean one          unlink($memdump); -        logmsg "*** Alloc number $limit is now set to fail ***\n" if($gdbthis); +        logmsg "*** Function number $limit is now set to fail ***\n" if($gdbthis);          my $ret = 0;          if($gdbthis) { @@ -655,7 +655,7 @@ sub torture {              }          }          if($fail) { -            logmsg " Failed on alloc number $limit in test.\n", +            logmsg " Failed on function number $limit in test.\n",              " invoke with \"-t$limit\" to repeat this single case.\n";              stopservers($verbose);              return 1; @@ -5377,7 +5377,7 @@ Usage: runtests.pl [options] [test selection(s)]    -rf      full run time statistics    -s       short output    -am      automake style output PASS/FAIL: [number] [name] -  -t[N]    torture (simulate memory alloc failures); N means fail Nth alloc +  -t[N]    torture (simulate function failures); N means fail Nth function    -v       verbose output    -vc path use this curl only to verify the existing servers    [num]    like "5 6 9" or " 5 to 22 " to run those tests only  | 
