1

コードがセグフォールトしている場所を特定できませんか?

基本的には、SSL(HTTPS)で保護された接続を介してサーバーに接続し、GETを実行して、MachineID(プログラムがパラメーターとして受け取る)を提供します。

一部のカスタムヘッダーも設定する必要があります。次に、返された本文とヘッダーを個別のテキストファイルとして保存します。(基本的にはシェルスクリプトを実行するので、リモートシステムはサーバーから「注文」を自動的に取得できます)

しかし、それはsegfaultsであり、これを開発しなければならない唯一のLinuxマシンは私のVPSです。これは、奇妙な仮想化のために、GDBの読み込み中に常にクラッシュします...:o

誰かが問題がどこにあるか教えてもらえますか?-ほぼ確実に文字列の連結であると思います-ヘッダーを作成し、URLを要求します。

編集:ええと、コードを忘れました!

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <curl/curl.h>
#include <string.h>

 static size_t write_data(void *ptr, size_t size, size_t nmemb, void *stream)
{
 int written = fwrite(ptr, size, nmemb, (FILE *)stream);
 return written;
}

int main(int argc, char *argv[])
{
static const char *headerfilename = "head.out";
static const char *bodyfilename = "body.out";

char *url = "https://fakeserver.fakesite.com:8443/SystemManager/getOrders.jsp?machineID=";
char *customHeader = "MachineID:";
char *machineID = NULL;

struct curl_slist *chunk = NULL;

CURL *curl;
CURLcode res;
FILE *headerfile;
FILE *bodyfile;

    if (argc == 2)
{
    machineID = argv[1];
    strcat(url,machineID);
}
else
{
 printf("Usage: %s <MachineID>\n", argv[0]);
 return 1;
}

 curl_global_init(CURL_GLOBAL_SSL);

 // init the curl session 
 curl = curl_easy_init();

 if(curl) {
    // set URL to get 

 curl_easy_setopt(curl, CURLOPT_URL, url);

    // no progress meter please 
    curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 1L);

    // send all data to this function 
 curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);

 // some servers don't like requests that are made without a user-agent field, so we provide one 
 curl_easy_setopt(curl, CURLOPT_USERAGENT, "libcurl-agent/1.0");

 // Also add a custom MachineID header 
 strcat(customHeader, machineID);
 chunk = curl_slist_append(chunk, customHeader);
 res = curl_easy_setopt(curl, CURLOPT_HTTPHEADER, chunk);

    // These tweaks must be enabled for my dodgy self-signed certificate.

    // DONT bother verifying our certificate is signed by a trusted CA.
    curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);
    // DONT check the hostname on the certificate matcheds the remote system.
    curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L);


    // open the files 
 headerfile = fopen(headerfilename,"w");
 if (headerfile == NULL) {
 curl_easy_cleanup(curl);
 return -1;
 }
 else
 {
 // we want the headers to this file handle 
 curl_easy_setopt(curl, CURLOPT_WRITEHEADER, headerfile);
 }

 bodyfile = fopen(bodyfilename,"w");
 if (bodyfile == NULL) {
 curl_easy_cleanup(curl);
 return -1;
 }
 else
 {
 // we want the body to this file handle 
 curl_easy_setopt(curl, CURLOPT_WRITEDATA, bodyfile);
 }
     // get it! 
 res = curl_easy_perform(curl);

    // close the files 
 fclose(headerfile);
 fclose(bodyfile);

 // always cleanup curl stuff 
 curl_easy_cleanup(curl);
 }
 curl_global_cleanup();
 return 0;
}

4

3 に答える 3

2

の宛先として文字列リテラルを使用していますstrcat。ポインタにメモリを割り当ててから、それらをstrcpyおよびstrcat関数の宛先として使用する必要があります

文字列リテラルは通常RO領域に存在し、そのような領域への書き込みは未定義の動作を引き起こす可能性があります

次のようなものを変更します

char *url

char url[100];

また、のバージョンと適切なバッファサイズを使用して、不注意によるバッファオーバーフローを防ぐことを検討してnください。strcatstrcpy

于 2012-04-28T10:06:37.873 に答える
0

参照用に提供されているコードで起こりうる間違いに関係なく、私の過去の意見では、libsslの使用はデフォルトでスレッドセーフではないことがわかりました。libsslを使用している場合は、お知らせください。その場合は、詳細をお知らせします。

詳細については、 http: //horstr.blogspot.in/2008/04/on-libcurl-openssl-and-thread-safety.htmlの落とし穴#2をご覧ください 。

于 2012-05-03T09:05:45.743 に答える
0

strcat自分でメモリを割り当てずに行うことはできません。

于 2012-04-28T10:06:21.040 に答える