2

簡単な 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)ます。これらの行がなくても、プログラムはクラッシュすることなく動作します。これらの行を削除すると、この場合、割り当てられたリソースの一部が解放されないのではないかと心配です。どうすればよいですか?

ありがとう。

4

3 に答える 3

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;   // thanks moowar's advice
于 2015-08-17T09:10:35.877 に答える
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文字だけを出力します:)

于 2014-02-27T10:53:05.290 に答える