LINUX.ORG.RU

inet_ntop после getaddrinfo ловит segfault


0

1

Есть простой исходник:

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <netdb.h>

struct addrinfo hints, *servinfo, *ptr;

memset(&hints, 0, sizeof(hints));
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;

if((rv = getaddrinfo("ya.ru", "9867", &hints, &servinfo)) != 0)
{
// ошибка выход
}

for(ptr = servinfo; ptr != NULL; ptr = ptr->ai_next) {
char addr* = NULL;
inet_ntop(ptr->ai_family, ptr->ai_addr, addr, ptr->ai_addrlen);
}
/* Дальше выполнение прерывается *.

Компилируется нормально

gcc -o getaddrinfo -g -Wall test.c

Ловит SEGFAULT на строке с inet_ntop. Как побороть?

Сегфолт не ловится, но поведение стало странным... Изменяю:

for(ptr = servinfo; ptr != NULL; ptr = ptr->ai_next) {
char addr* = NULL;
inet_ntop(ptr->ai_family, ptr->ai_addr, addr, ptr->ai_addrlen);
}
На:

for(ptr = servinfo; ptr != NULL; ptr = ptr->ai_next) {
char addr[INET6_ADDRSTRLEN];
memset(&addr, 0, INET6_ADDRSTRLEN);
inet_ntop(ptr->ai_family, ptr->ai_addr, addr, ptr->ai_addrlen);
printf("addr: %s\n");
}

Вывод:

2.0.38.139
2.0.38.139
2.0.38.139
2.0.38.139
2.0.38.139
2.0.38.139
2.0.38.139

Где-то еще косяк. Не могу понять где. Анон, выручай

greek_31 ★★ ()

Что это? Это весь исходник?

r2d2 ()
Ответ на: комментарий от r2d2

В моем мане нет примера с inet_ntop. getaddrinfo работает нормально.

Проблема в этом(из man 3 inet_ntop):

inet_ntop() extends the inet_ntoa(3) function to support multiple address families, inet_ntoa(3) is now considered to be deprecated in favor of inet_ntop().  The following address families are cur‐
       rently supported:

       AF_INET
              src  points  to  a  struct  in_addr  (in  network  byte order) which is converted to an IPv4 network address in the dotted-decimal format, "ddd.ddd.ddd.ddd".  The buffer dst must be at least
              INET_ADDRSTRLEN bytes long.

       AF_INET6
              src points to a struct in6_addr (in network byte order) which is converted to a representation of this address in the most appropriate IPv6 network address format for this address.  The buf‐
              fer dst must be at least INET6_ADDRSTRLEN bytes long.
Бесит подобная реализация.

greek_31 ★★ ()
Ответ на: комментарий от Artificial_Thought

Я этим согласен. Но проблема как раз в том, о чем я написал выше

greek_31 ★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.