Ошибка сегментации при отправке запроса htttps с помощью libcurl - PullRequest
0 голосов
/ 10 октября 2019

Я пытаюсь отправить запрос https с помощью libcurl, но при выполнении curl_easy_perform () возникла ошибка сегментации.

Система: CentOS release 6.2 (Final).

Вот функция, которую я реализовал:

size_t WriteBack( void *ptr, size_t size, size_t nmemb, void *stream ) {
    size_t realsize = size * nmemb;
    string *buffer = (string*)stream;
    buffer->append((const char *)ptr, realsize);

    return realsize;
}

bool ProfileOperator::CurlPost(const string &url, const string &postdata, string &res_buffer)
{
  CURL *curl;
  CURLcode code;
  curl = curl_easy_init();
  if (curl){
    curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
    curl_easy_setopt(curl, CURLOPT_POST, 1L);
    curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L);
    curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);
    curl_easy_setopt(curl, CURLOPT_POSTFIELDS, postdata.c_str());
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteBack);
    curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void*)&res_buffer);
    curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
    LOG(DEBUG) << curl_version();
    LOG(DEBUG) << "ready to send req, url: " << url << " postdata: " << postdata;
    code = curl_easy_perform(curl);
    curl_easy_cleanup(curl);
    if( code != CURLE_OK){
      LOG(WARNING) << "post req failed, res_buffer:" << res_buffer << " err:" << curl_easy_strerror(code);
      return false;
    }
  } else {
    return false;
  }
  return true;
}

когда я выполнил код выше, произошла ошибка сегментации, с GDB я получил информацию ниже:

Program terminated with signal 11, Segmentation fault.
#0  0x000000330f523e44 in X509_certificate_type () from /usr/lib64/libcrypto.so.10
Missing separate debuginfos, use: debuginfo-install addops-zookeeper-client-3.4.5-1.el6.x86_64 boost153-system-1.53.0-8.el6.x86_64 boost153-thread-1.53.0-8.el6.x86_64 glibc-2.12-1.132.el6_5.2.x86_64 keyutils-libs-1.4-5.el6.x86_64 krb5-libs-1.10.3-65.el6.x86_64 libcom_err-1.41.12-24.el6.x86_64 libqlog-2.1.14-1.el6.x86
_64 libselinux-2.0.94-7.el6.x86_64 nspr-4.8.8-3.el6.x86_64 nss-3.12.10-16.el6.x86_64 nss-softokn-freebl-3.14.3-10.el6_5.x86_64 nss-util-3.12.10-2.el6.x86_64 openldap-2.4.23-20.el6.x86_64 openssl-1.0.1e-57.el6.x86_64 snappy-1.0.5-1.el6.x86_64 zlib-1.2.3-29.el6.x86_64
(gdb) bt
#0  0x000000330f523e44 in X509_certificate_type () from /usr/lib64/libcrypto.so.10
#1  0x0000003310822c3b in ssl3_check_cert_and_algorithm () from /usr/lib64/libssl.so.10
#2  0x0000003310827951 in ssl3_connect () from /usr/lib64/libssl.so.10
#3  0x0000003310830e07 in ssl23_connect () from /usr/lib64/libssl.so.10

И я также попытался запросить с проверкой, как показано ниже, программа работаетхорошо, больше нет ошибки сегментации

size_t WriteBack( void *ptr, size_t size, size_t nmemb, void *stream ) {
    size_t realsize = size * nmemb;
    string *buffer = (string*)stream;
    buffer->append((const char *)ptr, realsize);

    return realsize;
}

bool ProfileOperator::CurlPost(const string &url, const string &postdata, string &res_buffer)
{
  CURL *curl;
  CURLcode code;
  curl = curl_easy_init();
  if (curl){
    curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
    curl_easy_setopt(curl, CURLOPT_POST, 1L);
    //curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L);
    //curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);
    curl_easy_setopt(curl, CURLOPT_POSTFIELDS, postdata.c_str());
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteBack);
    curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void*)&res_buffer);
    curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
    LOG(DEBUG) << curl_version();
    LOG(DEBUG) << "ready to send req, url: " << url << " postdata: " << postdata;
    code = curl_easy_perform(curl);
    curl_easy_cleanup(curl);
    if( code != CURLE_OK){
      LOG(WARNING) << "post req failed, res_buffer:" << res_buffer << " err:" << curl_easy_strerror(code);
      return false;
    }
  } else {
    return false;
  }
  return true;
}

, но запрос не выполнен с информацией об ошибке Problem with the SSL CA cert (path? access rights?)

команда curl в оболочке работает нормально, так что я думаю, что файл CA в порядке, его версияинформация

curl 7.37.0 (x86_64-unknown-linux-gnu) libcurl/7.25.0 OpenSSL/1.0.0 zlib/1.2.3 c-ares/1.7.0 libidn/1.18 libssh2/1.4.2
Protocols: file ftp ftps http https ldap ldaps scp sftp telnet tftp
Features: AsynchDNS IDN Largefile NTLM NTLM_WB SSL libz TLS-SRP Metalink

информация о версии libcurl: libcurl/7.65.1 OpenSSL/1.0.1e-fips zlib/1.2.3

Мне интересно, есть ли другой вариант, который мне нужно настроить для решения проблемы.

...