2016-07-23 2 views
0
내가 서버에서 메시지 응답을 수신 할

그래서 나는 울부 짖는 기능을 썼다 :오류의 malloc() : 메모리 손상

char * receive_response(SSL *ssl, BIO *outbio) { 
    int bytes; 
    int received = 0; 
    char *resp; 
    resp = (char *) malloc(4096*sizeof(char)); 
    bytes = SSL_read(ssl, resp, 4096); 
    resp[strlen(resp)] = '\0'; 
    if (bytes < 0) { 
     BIO_printf(outbio, "\nError reading...\n"); 
     exit(1); 
    } 
    received += bytes; 
    BIO_printf(outbio, "Received...%d bytes\n", received); 
    BIO_printf(outbio, "%s", resp); 
    BIO_printf(outbio, "Receive DONE\n"); 
    return resp; 
} 

하지만 오류 얻을 : 나는 그것을 실행할 때 메모리 손상 : malloc에를(). 이상한 일은 main에서 두 번째 시간에이 함수를 호출 할 때 발생합니다. 처음 엔 괜찮아. 이해해주세요.

+1

'memset 함수 (resof, 0, sizeof (resp));'잘못되었습니다 ... sizeof (resp)'는 할당 한 블록의 크기가 아니라 포인터의 크기입니다 ... 중요하지 않을 수도 있습니다. 또한,'strlen()'은 널 종결자를 사용하여 문자열의 끝이 어디인지를 결정하므로 null이 아직 추가되지 않은 경우에는 사용할 수 없습니다. – Dmitri

+0

죄송합니다. 먼저 resp를 배열로 선언 할 때 사용합니다. 나는 그것을 삭제했다. 그리고, strlen(), 고마워, 내 실수. 그러나 오류가 여전히 발생합니다. – thanhdx

+0

널 터미네이터 (4096 바이트까지 읽으면 4097 바이트)에 여분의 바이트를 할당하고'resp [strlen (resp)] = '\ 0'대신'resp [bytes] = '\ 0'; ' ;'('bytes'가> = 0인지 확인한 후에). 'strlen()'을 사용하면 null 종결자를 어디에 넣을 지 알아내는 것은 에러입니다. 왜냐하면'null '종결자가 아직 없다면'strlen()'이 제대로 작동하지 않을 것이기 때문입니다. 또한 버퍼를 언제 비우습니까? – Dmitri

답변

0

당신이 그것에 strlen를 호출 할 수 있도록 귀하의 문자열이 아직하는 '\0' 종료되지 않습니다

char * receive_response(SSL *ssl, BIO *outbio) { 
    int bytes; 
    int received = 0; 
    char *resp; 
    // add one extra room if 4096 bytes are effectivly got 
    resp = malloc(4096+1); 
    if (NULL == resp) 
    { 
     perror("malloc"); 
     exit(1); 
    } 
    bytes = SSL_read(ssl, resp, 4096); 
    if (bytes < 0) { 
     BIO_printf(outbio, "\nError reading...\n"); 
     exit(1); 
    } 
    resp[bytes] = '\0'; 
    received += bytes; 
    BIO_printf(outbio, "Received...%d bytes\n", received); 
    BIO_printf(outbio, "%s", resp); 
    BIO_printf(outbio, "Receive DONE\n"); 
    return resp; 
} 

또 다른 해결책 대신 malloccalloc라고 할 수 ...

+0

그는 또한 버퍼의 마지막 바이트로 데이터를 읽지 않도록해야합니다. '\ 0'의 여유 공간이 있는지 확인하십시오. – Dmitri

+0

@Dmitri Right, corrected – purplepsycho

+0

네, 고맙습니다. – thanhdx