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

Я использую LIBCURL в C для доступа к серверу, который требует токен. Я успешно получил токен, но у меня возникает ошибка сегментации при попытке добавить ЛЮБОЙ заголовок / текст при использовании s_list_append ();

Мой код приведен ниже: Одна вещь, на которую следует обратить внимание: моя первая функция «get_token» ничего не возвращает, я просто использую ее для анализа данных и получения токена, который сохраняется в глобальном токене.

Код завершается с ошибкой в ​​строке: headers = curl_slist_append (headers, "Accept: application / json");

CURL *curl;
struct curl_slist *headers = NULL;
char unamepass[] = "grant_type=password&username=uname&password=pass";
char url[] = "http://url1";
char url2[] = "http://url2";
char auth[256];
CURLcode res;

printf("Running...\n");
curl = curl_easy_init();

if(curl) {
  curl_easy_setopt(curl, CURLOPT_URL, url);
  curl_easy_setopt(curl, CURLOPT_POSTFIELDS, unamepass);
  curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, (long)strlen(unamepass));
  curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, get_token);
  res = curl_easy_perform(curl);
  if(res != CURLE_OK)
    fprintf(stderr, "curl_easy_perform() failed: %s\n",
            curl_easy_strerror(res));

  sprintf(auth, "Authorization: Bearer %s", token);
  headers = curl_slist_append(headers, "Accept: application/json");
  headers = curl_slist_append(headers, auth);
  curl_easy_setopt(curl, CURLOPT_HTTPGET,1L);
  curl_easy_setopt(curl, CURLOPT_URL, url2);
  curl_easy_setopt(curl, CURLOPT_HEADER, 1);
  curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
  curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);
  res = curl_easy_perform(curl);
}
curl_easy_cleanup(curl);

Я определенно получаю токен, однако после запуска моего первого исполнения я получаю сообщение об ошибке: «Не удалось записать данные в приложение / диск». Но так как я получил токен, я решил просто двигаться дальше, и в этом случае я получаю ошибку в первой функции s_list_append. У кого-нибудь есть идеи?

Edit1: я больше не получаю ошибку «Failed to write ...», поскольку теперь я правильно возвращаю размер данных в моем первом обратном вызове. Тем не менее, я все еще получаю segfault в строке curl_slist_append ().

Edit2: Помимо инициализации другого curl (curl2) или очистки исходного curl, любой другой вызов, который я делаю в библиотеке, такой как curl_slist_append или SET_OPT, вызывает segfault, так что это не просто функция добавления.

Edit3: решено: я самонадеянно полагал, что длина токена равна 512, оказывается, что он ближе к 1000, поэтому перезаписывая пространство памяти с помощью sprintf, я перезаписывал другую память, которая вызывала ошибки. Не проблема libcurl

...