Обязательно ли копировать возвращенную структуру из пространства ядра в пространство пользователя? - PullRequest
0 голосов
/ 06 марта 2012

если я сделаю системный вызов, скажем

struct hostent * gethostbyaddr (const char *addr, int len, int family );

и он возвращает struct*, мне нужно скопировать структуру куда-то, где я "владею", вместо того, чтобы напрямую использовать указатель?

Ответы [ 2 ]

3 голосов
/ 06 марта 2012

Документация gethostbyaddr читает (см. Раздел «Примечания»):

Функции gethostbyname () и gethostbyaddr () могут возвращать указатели на статические данные, которые могут бытьперезаписывается последующими звонками.Копирование структуры hostent недостаточно, поскольку оно содержит указатели;требуется глубокая копия.

Это означает, что вам нужно скопировать структуру, если вы хотите быть уверены, что она не будет перезаписана последующими вызовами gethostbyaddr.

Но вам действительно нужно рассмотреть возможность использования getaddrinfo, поскольку gethostbyaddr устарело.С getaddrinfo вы не будете задавать этот вопрос, потому что вам нужно будет выделить память для результата самостоятельно.

0 голосов
/ 06 марта 2012

Нет, вы можете использовать указатель напрямую.

(Подумайте об этом: если память была недоступна или небезопасна для доступа, вы не сможете ее скопировать; и наоборот, если вы сможете скопировать ее, вы также можете использовать ее на месте).

...