2013-09-02 1 views
1

я пишу функцию, где я манипулировать строку и возвращает строку malloc'd после серии зЬгсру и strcat:Утечка памяти с возвращаемой строки

char * doRequest(char *start, char**headers, char *body) 
{ 
    char * reply; 
    char * com; 
    int i; 

    reply = malloc(512 * sizeof(char)); 
    if (!reply) 
    return SRV_ERR; 
    strcpy(reply, "Your request "); 
    com = strtok(start, " "); 

    strcat(reply, com); 
    strcat(reply, " with options: "); 

    for (i = 0; headers[i] != NULL; i = i + 2) 
    { 
    strcat(reply, headers[i]); 
    strcat(reply, ", "); 
    } 
    strcat(reply, "has been received."); 
    strcat(reply, "\0"); 
    return reply; 
} 

, а затем я освобождаю возвращенный указатель в код вызывающего абонента:

... 

    char * reply = doRequest(command, headers, body); 
    int len = strlen(reply); 
    printf("Return message: %s\n", doRequest(command, headers, body)); 
    if(writen(s, reply, len) != len) printf("Write error while replying\n"); 
    else printf("Request served correctly.\n"); 
    free(reply); 

    ... 

Я думаю, что правильно, что свободная память, но Valgrind еще говорит, что эта память не освобождается и, следовательно, теряется. Что не так с этим кодом? Спасибо за помощь!

+2

'printf (" Обратное сообщение:% s \ n ", doRequest (команда, заголовки, тело));' Вы также называете это здесь и не освобождаете эту память. – Joe

+0

Кроме того, этот код будет делать неудобные вещи в момент, когда у вас больше 512 байтов данных, возвращающихся из doRequest. – Joe

+0

Правильно! Большое спасибо! – AndreaV

ответ

3

Память, выделенная вторым вызовом doRequest(), никогда не free() d.

Я предлагаю заменить эту строку:

printf("Return message: %s\n", doRequest(command, headers, body)); 

этим:

printf("Return message: '%s'\n", reply); 
+0

Конечно .. Как глупо! Я читал код много раз и никогда не замечал этого! Большое спасибо! – AndreaV

+0

@AndreaV: Добро пожаловать. Будьте уверены, что все мы знаем такую ​​слепоту ... ;-) – alk

2

PRINTF ("Return сообщение:% s \ п", doRequest (команда, заголовки, тела));

No free() для этого doRequest call. Возможно, вы имели в виду printf(..., reply)?

Кроме того, проверка strcpy + strcat без границ - это верный способ переполнения буфера.