X509_NAME_oneline返回的免费字符串

问题描述 投票:2回答:3

我试图使用一个简单的SSL示例。

这是一些代码:

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");
}

程序在free(line)代码行中崩溃。没有这些行,该程序可以正常运行而不会崩溃。如果我删除这些行,我担心在这种情况下,某些已分配的资源将不会被释放 - 我该怎么办?

谢谢。

c string openssl free
3个回答
6
投票

不确定,也许你可以使用:

OPENSSL_free(线);

我只是在我的Windows客户端上使用此代码,它工作正常:)


2
投票

根据http://linux.die.net/man/3/x509_name_oneline中函数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;

1
投票

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

#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字符:)

© www.soinside.com 2019 - 2024. All rights reserved.