Как правильно клонировать структуру addrinfo - PullRequest
0 голосов
/ 20 мая 2019

Мне нужно клонировать существующий указатель struct addrinfo. Я написал код ниже, чтобы клонировать его. Хотя это и работает нормально с точки зрения функциональности, но я получаю утечку памяти, когда освобождаю клонированный указатель addrfo strutc.

struct addrinfo * transport_clone_addrinfo(struct addrinfo *src)
{
    struct addrinfo *dst;

    if(src == NULL)
    {
        return NULL;
    }

    dst = calloc(1, sizeof(struct addrinfo));
    dst->ai_next = NULL;

    dst->ai_flags = 0; 
    dst->ai_family = src->ai_family;
    dst->ai_socktype = src->ai_socktype;
    dst->ai_protocol = src->ai_protocol;
    dst->ai_canonname = NULL;
    dst->ai_addrlen = src->ai_addrlen;
    dst->ai_addr = malloc(src->ai_addrlen);
    memcpy(dst->ai_addr, src->ai_addr, src->ai_addrlen);

    return dst;
}

int main(int argc, char **argv)
{
    char *ip = "192.168.1.10";
    unsigned short port = 5555;
    int index;
    int ret_val = -1;
    char service[8];
    struct addrinfo hints;
    struct addrinfo *rp = NULL;
    struct addrinfo *rp2;

    index = sprintf(service, "%u", port);
    service[index] = 0;

    if(true)
    {
        memset(&hints, 0, sizeof(struct addrinfo));
        hints.ai_family = AF_INET;
        ret_val = getaddrinfo(ip, NULL, &hints, &rp);
    }
    else
    {
        ret_val = getaddrinfo(ip, service, NULL, &rp);
    }

    if(ret_val != 0)
    {
        printf("\ngetaddrinfo failed\n");
    }

    rp2 = transport_clone_addrinfo(rp);

    freeaddrinfo(rp);
    freeaddrinfo(rp2);

    return 0;
}

При этом с функциональностью все работает нормально. Но valgrind сообщает об утечке памяти для строки кода ниже.

dst->ai_addr = malloc(src->ai_addrlen);

Затем я проверил код freeaddrinfo, я вижу, что член ai_addr структуры addrinfo явно не освобожден.

Возможно, я что-то упускаю при клонировании. Может ли кто-нибудь помочь мне понять, как правильно клонировать структуру addrinfo.

Есть ли C api для клонирования структуры addrinfo?

...