Я использую 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