【问题标题】:PHP extension seg fault when modifying a zval by reference通过引用修改 zval 时 PHP 扩展段错误
【发布时间】:2015-03-19 17:30:38
【问题描述】:

PHP:

$publickey = pack('H*', "03ca473d3c0cccbf600d1c89fa33b7f6b1f2b4c66f1f11986701f4b6cc4f54c360");  
$pubkeylen = strlen($publickey);  
$result = secp256k1_ec_pubkey_decompress($publickey, $pubkeylen);  

C 扩展:

PHP_FUNCTION(secp256k1_ec_pubkey_decompress) {
    secp256k1_start(SECP256K1_START_SIGN);

    zval *pubkey, *pubkeylen;
    unsigned char* newpubkey;
    int newpubkeylen;
    int result;

    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "zz", &pubkey, &pubkeylen) == FAILURE) {
        return;
    }

    newpubkey = Z_STRVAL_P(pubkey);
    newpubkeylen = Z_LVAL_P(pubkeylen);
    result = secp256k1_ec_pubkey_decompress(newpubkey, &newpubkeylen);

    if (result == 1) {
        newpubkey[newpubkeylen] = 0U;
        ZVAL_STRINGL(pubkey, newpubkey, newpubkeylen, 0);
        ZVAL_LONG(pubkeylen, newpubkeylen);
    }

    RETURN_LONG(result);
}

$publickey 被从 32 字节解压缩为 65 字节字符串,因为我们这样做时会遇到分段错误。
我认为我们在做一些结构上的错误......考虑到这是我们的第一个 PHP 扩展。

完整代码; https://github.com/afk11/secp256k1-php

【问题讨论】:

    标签: php pass-by-reference php-extension


    【解决方案1】:

    查看您的扩展代码后,您在构建扩展时没有链接实际的 secp256k1 库 (.so)(#include "secp256k1.h" 不包含实际的比特币/secp256k1 代码c 库)。

    您需要通过以下任一方式更改您的 config.m4

    1) 在“gcc”选项中添加“-l/path/to/bitcoin/secp256k1/lib”。

    帮助:在这里,我说的是一旦你“make install” bitcoin/secp256k1,一些库将安装到 /usr/lib 或 /usr/lib64 或 /usr/lib/secp256k1 等......

    -lsecp256k1
    
    // i.e. something like...
    PHP_NEW_EXTENSION(secp256k1, secp256k1.c, $ext_shared,, "-lsecp256k1 -DZEND_ENABLE_STATIC_TSRMLS_CACHE=1")
    

    2) 或者,在实际的 secp256k1 库中包含实际的 *.c 文件

    PHP_NEW_EXTENSION(secp256k1, secp256k1.c ../secp256k1/src/secp256k1.c ../secp256k1/src/others.c, $ext_shared,, -DZEND_ENABLE_STATIC_TSRMLS_CACHE=1)
    

    我会推荐选项 1

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-15
      • 2012-08-03
      • 2017-05-24
      相关资源
      最近更新 更多