0

次のコードでセグメンテーション違反が発生します。関数が変数の値の代わりに変数のアドレスを使用しようとしているためだと確信しています。私はポインターに少し慣れていません。

int main(int argc, char *argv[])
{

    EVP_PKEY        priv_key_p;
    X509_REQ        req_p;
    X509            cert;
    PKCS7           pkcs7;

        /*Need to store value in req_p and priv_key_p*/
    makecsr(&req_p, &priv_key_p, passphrase);

        /*Need to use value of req_p and priv_key_p*/
    create_cert(&req_p, &cert, &priv_key_p, passphrase);
}


int create_cert(X509_REQ *req_p, X509 *cert, EVP_PKEY *priv_key_p, char *passphrase)
{
    int i;
    long serial = 1;
    EVP_PKEY *pkey;
    const EVP_MD *digest;
    X509_NAME *name;
    X509V3_CTX ctx;

    /* verify signature on the request */
    if (!(pkey = X509_REQ_get_pubkey (req_p))) <--- Segmentation fault here!
        int_error ("Error getting public key from request");
    ....
}

makecsr を実行した後、GDB を使用して、priv_key_p と req_p の値を問題なく出力できます。

ただし、create_cert 関数内では、p *priv_key_p / *req_p と記述することによってのみ値を出力できます。

エラー

Program received signal SIGSEGV, Segmentation fault.
0xb7ebb747 in X509_REQ_get_pubkey ()
   from /lib/i386-linux-gnu/libcrypto.so.1.0.0
4

2 に答える 2

0

エラーは、req_p の間違ったポインター型を create_cert に渡していたためです。

解決策は、create_cert を次のように変更することでした。

int create_cert(X509 *req_p, X509 **cert, EVP_PKEY **priv_key_p, char * passphrase)

于 2013-10-11T09:43:14.630 に答える
0

あなたのコード:

if (!(pkey = X509_REQ_get_pubkey (req_p))) <--- Segementation fault here!
    int_error ("Error getting public key from request");
    ....

これを試してください:

if (!(pkey == X509_REQ_get_pubkey (req_p))) <--- Segementation fault here!
    int_error ("Error getting public key from request");
    ....
于 2013-10-10T11:23:24.287 に答える