fix null termination of description and friendly_name in ip_interface on linux

This commit is contained in:
arvidn 2020-01-04 22:49:16 +01:00 committed by Arvid Norberg
parent 3caae922aa
commit 3569b8885e
2 changed files with 11 additions and 22 deletions

View File

@ -60,9 +60,9 @@ namespace libtorrent {
{ {
address interface_address; address interface_address;
address netmask; address netmask;
char name[64]; char name[64]{};
char friendly_name[128]; char friendly_name[128]{};
char description[128]; char description[128]{};
// an interface is preferred if its address is // an interface is preferred if its address is
// not tentative/duplicate/deprecated // not tentative/duplicate/deprecated
bool preferred = true; bool preferred = true;
@ -73,7 +73,7 @@ namespace libtorrent {
address destination; address destination;
address netmask; address netmask;
address gateway; address gateway;
char name[64]; char name[64]{};
int mtu; int mtu;
}; };

View File

@ -423,7 +423,6 @@ namespace {
static_assert(sizeof(ip_info->name) >= IF_NAMESIZE, "not enough space in ip_interface::name"); static_assert(sizeof(ip_info->name) >= IF_NAMESIZE, "not enough space in ip_interface::name");
if_indextoname(addr_msg->ifa_index, ip_info->name); if_indextoname(addr_msg->ifa_index, ip_info->name);
return true; return true;
} }
#endif // TORRENT_USE_NETLINK #endif // TORRENT_USE_NETLINK
@ -480,9 +479,7 @@ int _System __libsocket_sysctl(int* mib, u_int namelen, void *oldp, size_t *oldl
} }
std::strncpy(rv.name, ifa->ifa_name, sizeof(rv.name)); std::strncpy(rv.name, ifa->ifa_name, sizeof(rv.name));
rv.name[sizeof(rv.name) - 1] = 0; rv.name[sizeof(rv.name) - 1] = '\0';
rv.friendly_name[0] = 0;
rv.description[0] = 0;
// determine address // determine address
rv.interface_address = sockaddr_to_address(ifa->ifa_addr); rv.interface_address = sockaddr_to_address(ifa->ifa_addr);
@ -658,9 +655,7 @@ int _System __libsocket_sysctl(int* mib, u_int namelen, void *oldp, size_t *oldl
ip_interface iface; ip_interface iface;
iface.interface_address = sockaddr_to_address(&item.ifr_addr); iface.interface_address = sockaddr_to_address(&item.ifr_addr);
std::strncpy(iface.name, item.ifr_name, sizeof(iface.name)); std::strncpy(iface.name, item.ifr_name, sizeof(iface.name));
iface.name[sizeof(iface.name) - 1] = 0; iface.name[sizeof(iface.name) - 1] = '\0';
iface.friendly_name[0] = 0;
iface.description[0] = 0;
ifreq req = {}; ifreq req = {};
std::strncpy(req.ifr_name, item.ifr_name, IF_NAMESIZE - 1); std::strncpy(req.ifr_name, item.ifr_name, IF_NAMESIZE - 1);
@ -725,11 +720,11 @@ int _System __libsocket_sysctl(int* mib, u_int namelen, void *oldp, size_t *oldl
{ {
ip_interface r; ip_interface r;
std::strncpy(r.name, adapter->AdapterName, sizeof(r.name)); std::strncpy(r.name, adapter->AdapterName, sizeof(r.name));
r.name[sizeof(r.name) - 1] = 0; r.name[sizeof(r.name) - 1] = '\0';
wcstombs(r.friendly_name, adapter->FriendlyName, sizeof(r.friendly_name)); wcstombs(r.friendly_name, adapter->FriendlyName, sizeof(r.friendly_name));
r.friendly_name[sizeof(r.friendly_name) - 1] = 0; r.friendly_name[sizeof(r.friendly_name) - 1] = '\0';
wcstombs(r.description, adapter->Description, sizeof(r.description)); wcstombs(r.description, adapter->Description, sizeof(r.description));
r.description[sizeof(r.description) - 1] = 0; r.description[sizeof(r.description) - 1] = '\0';
for (IP_ADAPTER_UNICAST_ADDRESS* unicast = adapter->FirstUnicastAddress; for (IP_ADAPTER_UNICAST_ADDRESS* unicast = adapter->FirstUnicastAddress;
unicast; unicast = unicast->Next) unicast; unicast = unicast->Next)
{ {
@ -766,16 +761,13 @@ int _System __libsocket_sysctl(int* mib, u_int namelen, void *oldp, size_t *oldl
int n = size / sizeof(INTERFACE_INFO); int n = size / sizeof(INTERFACE_INFO);
ip_interface iface;
for (int i = 0; i < n; ++i) for (int i = 0; i < n; ++i)
{ {
ip_interface iface;
iface.interface_address = sockaddr_to_address(&buffer[i].iiAddress.Address); iface.interface_address = sockaddr_to_address(&buffer[i].iiAddress.Address);
if (iface.interface_address == address_v4::any()) continue; if (iface.interface_address == address_v4::any()) continue;
iface.netmask = sockaddr_to_address(&buffer[i].iiNetmask.Address iface.netmask = sockaddr_to_address(&buffer[i].iiNetmask.Address
, iface.interface_address.is_v4() ? AF_INET : AF_INET6); , iface.interface_address.is_v4() ? AF_INET : AF_INET6);
iface.name[0] = 0;
iface.friendly_name[0] = 0;
iface.description[0] = 0;
ret.push_back(iface); ret.push_back(iface);
} }
@ -791,13 +783,10 @@ int _System __libsocket_sysctl(int* mib, u_int namelen, void *oldp, size_t *oldl
udp::resolver r(ios); udp::resolver r(ios);
udp::resolver::iterator i = r.resolve(udp::resolver::query(boost::asio::ip::host_name(ec), "0"), ec); udp::resolver::iterator i = r.resolve(udp::resolver::query(boost::asio::ip::host_name(ec), "0"), ec);
if (ec) return ret; if (ec) return ret;
ip_interface iface;
for (;i != udp::resolver::iterator(); ++i) for (;i != udp::resolver::iterator(); ++i)
{ {
ip_interface iface;
iface.interface_address = i->endpoint().address(); iface.interface_address = i->endpoint().address();
iface.name[0] = 0;
iface.friendly_name[0] = 0;
iface.description[0] = 0;
if (iface.interface_address.is_v4()) if (iface.interface_address.is_v4())
iface.netmask = address_v4::netmask(iface.interface_address.to_v4()); iface.netmask = address_v4::netmask(iface.interface_address.to_v4());
ret.push_back(iface); ret.push_back(iface);