1

printf を挿入しない限り、コア ダンプで中止する関数があります。

// Read all available text from the connection
char *sslRead (connection *c)
{
    const int readSize = 1024;
    char *rc = NULL;
    int received, count = 0;
    char buffer[1024];

    //  printf("??"); // If I comment this out: Aborted (core dumped)

    if (c)
    {
        while (1)
        {
            if (!rc)
                rc = malloc (readSize * sizeof (char) + 1);
            else
                rc = realloc (rc, (count + 1) *
                        readSize * sizeof (char) + 1);

            received = SSL_read (c->sslHandle, buffer, readSize);
            buffer[received] = '\0';

            if (received > 0)
                strcat (rc, buffer);

            if (received < readSize)
                break;
            count++;
        }
    }
    return rc;
}

malloc が問題のある行のようです。

完全なソース コードはこちら: Quickly using OpenSSL in C

何が原因でしょうか?

Below is the output from my build:

23:06:41 **** Incremental Build of configuration Debug for project HelloWorldOpenSSL ****
Info: Internal Builder is used for build
gcc "-IC:\\dev\\cygwin64\\opt\\cs\\include" -O0 -g3 -Wall -c -fmessage-length=0 -o MyC.o "..\\MyC.c" 
gcc "-LC:\\dev\\cygwin64\\opt\\cs\\lib" -o HelloWorldOpenSSL.exe MyC.o -lssl -lcrypto 

23:06:42 Build Finished (took 804ms)

EDIT :私が使用した修正はここに掲載されています。

4

2 に答える 2

8
const int readSize = 1024;
char buffer[1024];
     :
received = SSL_read (c->sslHandle, buffer, readSize);
buffer[received] = '\0';

1024 バイトのバッファーを割り当て、1024 バイトを読み取り、バッファーの末尾から 1025 番目のバイトを書き込みます...

于 2013-09-17T22:15:22.700 に答える
0

この問題を解決するために、次のことを行いました。

  1. Chris Dodd の回答hereに記載されているように、バッファ サイズを増やしました。
  2. デバッグ中に、strlen(rc) が必要以上に大きいことに気付いたので、rc 文字列を NULL で終了してから strcat に渡しました。

コードは現在正常に動作しているようです。

// Read all available text from the connection
char *sslRead (connection *c)
{
    const int readSize = 1024;
    char *rc = NULL;
    int received, count = 0;
    char buffer[1025];         // increased buffer

    if (c)
    {
        while (1)
        {
            if (!rc)
                rc = malloc (readSize * sizeof(char) + 1);
            else
                rc = realloc (rc, (count + 1) * readSize * sizeof(char) + 1);

            received = SSL_read (c->sslHandle, buffer, readSize);

            if (received > 0)
            {
                rc[count * readSize] = '\0';   // null terminate rc
                buffer[received] = '\0';
                strcat (rc, buffer);
            }

            if (received < readSize)
                break;
            count++;
        }
    }
    return rc;
}
于 2013-09-17T23:09:47.733 に答える