BN_CTX_free () против BN_CTX_end () EXC_BAD_ACCESS исключение - PullRequest
0 голосов
/ 14 июня 2019

Из OpenSSL документов , BN_CTX_end() должен вызываться до BN_CTX_free(), однако в приведенном ниже примере я получаю исключение неверного доступа при запуске программы в порядке, указанном в документах ( обратите внимание, что в документах написано в большинстве случаев , но я не уверен, как проверить, следует ли мне звонить BN_CTX_end() до BN_CTX_free())

BIGNUM* util::math::find_seed_num(std::vector<int> lst, int lst_int, int index) {
    //python: reduce((lambda x, y: x * y), lst[0:index]) % lst_int

    BN_CTX* ctx;
    ctx = BN_CTX_new();

    cout << "\nsize of lst " << lst.size() << "\n";
    BIGNUM *sum = BN_new();
    BIGNUM *tmp = BN_new();

    sum = BN_CTX_get(ctx);
    BN_set_word(sum, lst[0]);

    cout << "\n index: " << index << "\n";

    for (int a = 1; a < index; a = a + 1) {
        BN_set_word(tmp, lst[a]);
        cout << "temp = " << BN_bn2dec(tmp) << "\n";
        BN_mul(sum, sum, tmp, ctx);
        cout << "sum = " << BN_bn2dec(sum) << "\n";
    }

    BIGNUM *result = BN_new();
    BIGNUM *modulo = BN_new();

    BN_set_word(modulo, lst_int);

    BN_nnmod(result, sum, modulo, ctx);

    cout << "\nsum: " << BN_bn2dec(result) << "\n";

    BN_free(sum);
    BN_free(result);
    BN_free(modulo);
    BN_free(tmp);
    BN_CTX_end(ctx); //Running this produces the exception
    BN_CTX_free(ctx); //Running this w/out the above line leads to no exception thrown

    return result;
}

Я новичок в C ++, поэтому меня беспокоит то, что контекст не освобождается должным образом, если BN_CTX_end(); не вызывается.

1 Ответ

2 голосов
/ 14 июня 2019

Я не эксперт по OpenSSL, но в документации написано

Функция должна сначала вызвать BN_CTX_start (). Затем BN_CTX_get () может вызываться повторно для получения временных BIGNUM. Все вызовы BN_CTX_get () должны быть выполнены до вызова любых других функций, которые используют ctx в качестве аргумента.

Наконец, BN_CTX_end () должен быть вызван

Поэтому попробуйте добавить BN_CTX_start в начале после BN_CTX_new (см. https://www.openssl.org/docs/man1.0.2/man3/BN_CTX_start.html)

Во-вторых, из документа:

Когда вызывается BN_CTX_end (), указатели BIGNUM, полученные из BN_CTX_get (), становятся недействительными.

Так что вы можете попытаться избежать освобождения суммы, потому что она (по крайней мере, насколько я знаю) будет освобождена после того, как вы позвоните BN_CTX_end()

Наконец (незначительная проблема):

BIGNUM *sum = BN_new();
....
sum = BN_CTX_get(ctx);

Сначала вы выделяете BIGNUM, затем перезаписываете указатель другим указателем на другое место в памяти. Таким образом, вы теряете указатель, что приводит к утечке памяти. Попробуйте использовать либо BN_new() (в этом случае вы должны освободить), либо BN_CTX_get

Я пытался скомпилировать MSVC 2019, и вызов BN_CTX_start() уже решил проблему для меня.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...