【问题标题】:Passing pointer to function causes segmentation fault when trying to retrieve value尝试检索值时将指针传递给函数会导致分段错误
【发布时间】:2013-10-10 10:49:47
【问题描述】:

以下代码出现分段错误。我很确定这是因为一个函数试图使用变量的地址而不是它的值。我对指针有点陌生。

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

使用GDB,makecsr执行后,我可以打印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

【问题讨论】:

  • 你能解释一下你的代码吗,我的意思是你的变量的类型是什么。在目前的状态下,这个问题很难回答。
  • X509_REQ_get_pubkey (&amp;req_p) 试试这个。(在黑暗中拍摄)
  • 类型来自OpenSSL library,&req_p 也没有运气
  • 您能否提供创建 CSR 的函数中的代码:makecsr?我猜错误可能来自这里
  • here

标签: c pointers openssl segmentation-fault memory-address


【解决方案1】:

你的代码:

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

【讨论】:

  • 您应该指出第一个分配给 pkey,而第二个分配给 pkey。没有它们并排,很难看出区别。
  • 不幸的是,错误在于X509_REQ_get_pubkey (req_p)
【解决方案2】:

错误是因为我将 req_p 的错误指针类型传递给 create_cert。

解决方案是将 create_cert 更改为:

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

【讨论】:

  • 不,不是。您的 create_cert 应该保持不变,您的 makecsr 中的实习生函数只需修改即可。 (就像之前评论中提供的链接一样!)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-15
  • 1970-01-01
相关资源
最近更新 更多