由X509_NAME_oneline返回的自由字符串

问题描述:

我正在尝试使用SSL示例。由X509_NAME_oneline返回的自由字符串

这是它的一些代码。

void ShowCerts(SSL* ssl) 
{ 
    X509 *cert; 
    char *line; 

    cert = SSL_get_peer_certificate(ssl); /* get the server's certificate */ 
    if (cert != NULL) 
    { 
     printf("Server certificates:\n"); 
     line = X509_NAME_oneline(X509_get_subject_name(cert), 0, 0); 
     printf("Subject: %s\n", line); 
     free(line);  /* free the malloc'ed string */ 
     line = X509_NAME_oneline(X509_get_issuer_name(cert), 0, 0); 
     printf("Issuer: %s\n", line); 
     free(line);  /* free the malloc'ed string */ 
     X509_free(cert);  /* free the malloc'ed certificate copy */ 
    } 
    else 
     printf("No certificates.\n"); 
} 

程序在空闲(行)行中崩溃。没有这些行程序,程序不会崩溃。但恐怕在这种情况下,一些分配的资源并不是免费的。

+0

打印0字节的数据有什么意义?这就是你正在做的。 – 2013-03-02 15:10:27

+1

你确定分配发生在第一位吗?请检查函数SSL_get_peer_certificates和X509_etc的错误代码,以查看它们在失败时返回的内容 – Fingolfin 2013-03-02 15:21:30

不知道,也许你可以使用:

OPENSSL_free(线);

我只是用我的Windows客户端上的代码,并能正常工作:)

我建议你去尝试这样的事:

#define MAX_DN_SIZE 2000 // whatever big enough size here 

char line[MAX_DN_SIZE+1]; 
.... 
X509_NAME_oneline(X509_get_subject_name(cert), line, MAX_DN_SIZE); // convert 
line[MAX_DN_SIZE] = '\0'; // set paranoid terminator in case DN is exactly MAX_DN_SIZE long 

,并删除了“自由”。当然,这将只打印您的DN :)

的第一MAX_DN_SIZE字符根据功能X509_NAME_oneline的描述http://linux.die.net/man/3/x509_name_oneline,如果指针lineNULL,则该函数将动态地为它分配内存。否则,它只返回指针line

我想预先分配空间并手动释放。如下所示:

#define MAX_SIZE 1000 
char* line = new char[ MAX_SIZE + 1 ]; 
printf("%s\n", X509_NAME_oneline(X509_get_subject_name(cert), line, MAX_SIZE)); 
delete line;