dear all:
    No one encountered this problem?


>From: "" <lizhip...@cnnic.cn>
>Reply-To: openssl-users@openssl.org
>To: openssl-users@openssl.org
>Subject: about ssl_accept and memory leak
>Date:Mon, 27 Dec 2010 13:38:49 +0800
>
>Dear openssl-users£¬
>  
>  
> When using the openssl and found a large number of connections during the
> establishment of the memory has been growing closed, the test found that when
the
> memory is increased to 317548K, the not increased, the initial memory, only a
few
> K, very strange.  
> why? How can I resolve it? 
> thank u!
>  
> code£º
> server.c
> 
> 
> #include <stdio.h>
> #include <stdlib.h>
> #include <errno.h>
> #include <string.h>
> #include <sys/types.h>
> #include <netinet/in.h>
> #include <sys/socket.h>
> #include <sys/wait.h>
> #include <unistd.h>
> #include <arpa/inet.h>
> #include <openssl/ssl.h>
> #include <openssl/err.h>
> #include <string>
> using namespace std;
> 
> 
> 
> 
> std::string a_serverCert = "server_cert/newcert.pem";
> std::string a_serverKey = "server_cert/newkey.pem";
> std::string a_trustCert = "server_cert/cacert.pem";
> std::string a_password = "1234";
> 
> 
> #define MAXBUF 1024
> 
> 
> int main(int argc, char **argv)
> {
>     int sockfd, new_fd;
>     socklen_t len;
>     struct sockaddr_in my_addr, their_addr;
>     unsigned int myport, lisnum;
>     char buf[MAXBUF + 1];
>     SSL_CTX *ctx;
> 
>     myport = 8899;
> 
> 
>     lisnum = 2;
> 
> 
>     SSL_library_init();
>   
>     OpenSSL_add_all_algorithms();
>    
>     SSL_load_error_strings();
>  
>     ctx = SSL_CTX_new(SSLv23_server_method());
>   
>     if (ctx == NULL) {
>         ERR_print_errors_fp(stdout);
>         exit(1);
>     }
>     
>     if (SSL_CTX_use_certificate_file(ctx, a_serverCert.c_str(),
SSL_FILETYPE_PEM)
> <= 0) {
>         ERR_print_errors_fp(stdout);
>         exit(1);
>     }
> 
> 
> //set the key file's password.
> SSL_CTX_set_default_passwd_cb_userdata(ctx, (void*) (a_password.c_str()));
> 
> 
>     
>     if (SSL_CTX_use_PrivateKey_file(ctx, a_serverKey.c_str(), 
> SSL_FILETYPE_PEM)
<=
> 0) {
>         ERR_print_errors_fp(stdout);
>         exit(1);
>     }
>    
>     if (!SSL_CTX_check_private_key(ctx)) {
>         ERR_print_errors_fp(stdout);
>         exit(1);
>     }
> 
> 
> //set vefify client, the server will verify client's certification
> SSL_CTX_set_verify(ctx, SSL_VERIFY_PEER, NULL);
> 
> 
> //load trust certification. it is CA root certification or user's 
> certification
> SSL_CTX_load_verify_locations(ctx, a_trustCert.c_str(), NULL);
> 
> 
>     
>     printf("socket creating......  \t\t");
>     if ((sockfd = socket(PF_INET, SOCK_STREAM, 0)) == -1) 
>        {
>         perror("socket");
>         exit(1);
>        }
>      else
>        printf("socket created.\n");
> 
> 
>     bzero(&my_addr, sizeof(my_addr));
>     my_addr.sin_family = PF_INET;
>     my_addr.sin_port = htons(myport);
>     my_addr.sin_addr.s_addr = INADDR_ANY;
> 
> 
>     printf("bingding......\t\t\t");
>     if (bind(sockfd, (struct sockaddr *) &my_addr, sizeof(struct sockaddr))
>         == -1) {
>         perror("bind");
>         exit(1);
>     } else
>         printf("binded.\n");
> 
> 
>     if (listen(sockfd, lisnum) == -1) {
>         perror("listen");
>         exit(1);
>     } else
>         printf("begin listen......\n");
> 
> 
>     while (1)
> {
>         SSL *ssl;
>         len = sizeof(struct sockaddr);
>         
>         if ((new_fd =
>              accept(sockfd, (struct sockaddr *) &their_addr,
>                     &len)) == -1) {
>             perror("accept");
>             //exit(errno);
> continue;
>         } else
>             printf("server: got connection from %s, port %d, socket %d\n",
>                    inet_ntoa(their_addr.sin_addr),
>                    ntohs(their_addr.sin_port), new_fd);
> 
> 
>         
>         ssl = SSL_new(ctx);
>         
>         SSL_set_fd(ssl, new_fd);
>        
>         if (SSL_accept(ssl) == -1) {
>             perror("accept");
>             close(new_fd);
>            continue;
>         }
> 
> 
>       
>         bzero(buf, MAXBUF + 1);
>         
>  //       scanf("%[^\n]",buf);
> 
> 
> //         
> //         len = SSL_write(ssl, buf, strlen(buf));
> // 
> //         if (len <= 0) {
> //             printf
> //                 ("send msg:'%s' failed£¡error code:%d£¬error info'%s'\n",
> //                  buf, errno, strerror(errno));
> //             goto finish;
> //         } else
> //             printf("send msg:'%s' ok£¬len:%d\n",
> //                    buf, len);
> 
> 
>         bzero(buf, MAXBUF + 1);
>        
>         len = SSL_read(ssl, buf, MAXBUF);
>         if (len > 0)
>             printf("read msg:'%s'£¬len:%d \n",
>                    buf, len);
>         else
>             printf
>                 ("read failed£¡error code:%d£¬error info: '%s'\n",
>                  errno, strerror(errno));
>         
>       finish:
>       
>         SSL_shutdown(ssl);
>        
>         SSL_free(ssl);
>         
>         close(new_fd);
>     }
> 
> 
>    
>     close(sockfd);
>     SSL_CTX_free(ctx);
>     return 0;
> }
> 
> 
> ______________________________________________________________________
> OpenSSL Project                                 http://www.openssl.org
> User Support Mailing List                    openssl-users@openssl.org
> Automated List Manager                           majord...@openssl.org
>


______________________________________________________________________
OpenSSL Project                                 http://www.openssl.org
User Support Mailing List                    openssl-users@openssl.org
Automated List Manager                           majord...@openssl.org

Reply via email to