2011-02-03 43 views
0

誰もこの機能で問題を見つけることができますか? 私のアプリケーションはいくつかのリクエストを行い、最初のリクエストがSSLを使用している場合、アプリは一部のコンピュータでクラッシュします(クラッシュなしで動作します)。ここでwininet C++の問題

はコード

char Buffer[1024]; 
DWORD dwRead; 
string data; 

string Request(string method, string host, string file, string headers, 
       string post, bool debug, bool SSL) 
{ 
    HINTERNET hSession, hDownload, hRequest; 
    DWORD flag; 
    DWORD port; 

    data.empty(); 

    //SSL or not + flag :) 
    if (SSL) 
    { 
     port = INTERNET_DEFAULT_HTTPS_PORT; 
     flag = INTERNET_FLAG_SECURE; // FLAG_SECURE 
    } 
    else 
    { 
     port = INTERNET_DEFAULT_HTTP_PORT; 
     flag = INTERNET_FLAG_RELOAD; //FLAG_RELOAD 
    } 

    char * postdata; 
    postdata = new char[post.size() + 1]; 
    strcpy(postdata, post.c_str()); 
    char * headersdata; 
    headersdata = new char[headers.size() + 1]; 
    strcpy(headersdata, headers.c_str()); 

    //Actual request 
    hSession 
      = InternetOpen(
        "Mozilla/5.0 (Windows; U; Windows NT 6.1; sl; rv:1.9.2.11) Gecko/20101012 Firefox/3.6.11", 
        INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0); 
    if (hSession) 
    { 
     hDownload = InternetConnect(hSession, host.c_str(), port, NULL, NULL, 
       INTERNET_SERVICE_HTTP, 0, 0); 
     if (hDownload) 
     { 
      hRequest = HttpOpenRequest(hDownload, method.c_str(), file.c_str(), 
        "HTTP/1.1", NULL, NULL, flag, 0); 
      if (hRequest) 
      { 
       if (strlen(headersdata) && strlen(postdata)) 
       { 
        HttpSendRequest(hRequest, headersdata, strlen(headersdata), 
          postdata, strlen(postdata)); 
       } 
       else 
       { 
        HttpSendRequest(hRequest, NULL, 0, NULL, 0); 
       } 
      } 
     } 
    } 
    //Writing HTML response in data buffer 
    while (InternetReadFile(hRequest, Buffer, sizeof(Buffer), &dwRead)) 
    { 
     if (dwRead == 0) 
     { 
      break; 
     } 
     Buffer[dwRead] = 0; 
     data += Buffer; 
    } 

    //Debug :) 
    if (debug) 
    { 
     ofstream dbgfile; 
     dbgfile.open("debug.html"); 
     dbgfile << data; 
     dbgfile.close(); 
    } 

    //Close handles 
    InternetCloseHandle(hSession); 
    InternetCloseHandle(hDownload); 
    InternetCloseHandle(hRequest); 

    return data; 
} 

おかげです。

+0

クラッシュが発生したときに表示されるエラーは何ですか?アクセス違反?その他のエラーコード? –

+0

エラー**このアプリケーションは異常時に終了するようにランタイムを要求しています** ここではあまりにも悪いのでデバッグできませんでした:( – pwnu91

+0

リモートデバッグを試すことができました... – smerlin

答えて

0

まず、バッファオーバーフローがBufferになっています。

while (InternetReadFile(hRequest, Buffer, sizeof(Buffer), &dwRead)) 

Buffer[dwRead] = 0; 

あなたはかつての行にsizeof(Buffer)としてdwNumberOfBytesToReadパラメータを渡すので、dwReadの最大値はsizeof(Buffer)です:

は、これらの行を考えてみましょう。このような場合、後者の行は、Bufferの最後を1バイト超えて書き込みます。ランタイムセキュリティチェックが有効になっていない限り、クラッシュメッセージを説明できるデータレイアウトではクラッシュする可能性はありません(しかし、それはまさにチャンスです)。

また、私が覚えている限り、「このアプリケーションは異常な方法で終了させるためにランタイムを要求しました」というメッセージはassert()またはterminate()のMicrosoft実装で表示されます。 (私は現時点でMSVCを利用できませんし、それを検証することはできません)。このコードでどちらかの理由がわかりませんが、Bufferがオーバーフローしていない場合は、他の場所でもそれを探します。

+0

私に教えてくれてありがとうそれを修正しました:) しかし、まだそれは問題を解決しません... :( 私はいくつかのマシン上でのみクラッシュする理由はわかりません... – pwnu91

0

は、strlen関数を削除するようにしてください:

HttpSendRequest(hRequest, &headers.front(), headers.size(), 
       &post.front(), post.size()); 

この場合、機能が少しより安全になります。

とにかく、Crash Dump Analysisを使用することを検討してください。この場合、「いくつかのコンピュータ」から取得したクラッシュダンプからコールスタックをチェックすることができます。