我正在Mac OS X中进行一些插入(本质上是拦截C调用),我注意到ping应用程序尝试使用addrlen值16调用sendto函数。在sys / socket.h中我可以清楚地看到sa_data数组最多只能包含14个字节:
/*
* [XSI] Structure used by kernel to store most addresses.
*/
struct sockaddr {
__uint8_t sa_len; /* total length */
sa_family_t sa_family; /* [XSI] address family */
char sa_data[14]; /* [XSI] addr value (actually larger) */
};
这让我感到很震惊,评论说“实际上是更大的”#34;但我无能为力。
无论如何,手册页显示sendto函数的签名如下所示:
ssize_t
sendto(int socket,
const void *buffer,
size_t length,
int flags,
const struct sockaddr *dest_addr,
socklen_t dest_len);
然后,如果长度值太长而无法以原子方式传递消息,则手册页将专门调出要执行的操作。它忽略了dest_len大于dest_addr.sa_data可以容纳的情况。
如果我尝试将16字节的数据复制到来自调用者的另一个dest_addr.sa_data,则它会失败并且应用程序崩溃,应该如此。我误解了这个领域是如何使用的吗?为什么标题中的评论说"实际上更大"但是然后为数组分配一个固定的大小?
答案 0 :(得分:1)
你实际上不应该使用struct sockaddr
。它就像void
中的void *
,是实际sockaddr_foo
结构的替代。