Skip to content

Commit

Permalink
fix: Fake broadcast address for 127.x.x.x
Browse files Browse the repository at this point in the history
  • Loading branch information
iacore authored and iphydf committed Jan 16, 2025
1 parent aa64916 commit d9b8fa6
Showing 1 changed file with 25 additions and 4 deletions.
29 changes: 25 additions & 4 deletions toxcore/LAN_discovery.c
Original file line number Diff line number Diff line change
Expand Up @@ -124,6 +124,9 @@ static Broadcast_Info *fetch_broadcast_info(const Memory *mem, const Network *ns

#elif !defined(FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION) && (defined(__linux__) || defined(__FreeBSD__) || defined(__DragonFly__))

non_null()
static bool ip4_is_local(const IP4 *ip4);

non_null()
static Broadcast_Info *fetch_broadcast_info(const Memory *mem, const Network *ns)
{
Expand Down Expand Up @@ -167,7 +170,8 @@ static Broadcast_Info *fetch_broadcast_info(const Memory *mem, const Network *ns
const int n = ifc.ifc_len / sizeof(struct ifreq);

for (int i = 0; i < n; ++i) {
/* there are interfaces with are incapable of broadcast */
/* there are interfaces with are incapable of broadcast
* on Linux, `lo` has no broadcast address, but this function returns `>=0` */
if (ioctl(net_socket_to_native(sock), SIOCGIFBRDADDR, &i_faces[i]) < 0) {
continue;
}
Expand All @@ -177,18 +181,35 @@ static Broadcast_Info *fetch_broadcast_info(const Memory *mem, const Network *ns
continue;
}

const struct sockaddr_in *sock4 = (const struct sockaddr_in *)(void *)&i_faces[i].ifr_broadaddr;
const struct sockaddr_in *broadaddr4 = (const struct sockaddr_in *)(void *)&i_faces[i].ifr_broadaddr;

if (broadcast->count >= MAX_INTERFACES) {
break;
}

IP *ip = &broadcast->ips[broadcast->count];
ip->family = net_family_ipv4();
ip->ip.v4.uint32 = sock4->sin_addr.s_addr;
ip->ip.v4.uint32 = broadaddr4->sin_addr.s_addr;

// if no broadcast address
if (ip->ip.v4.uint32 == 0) {
continue;
if (ioctl(net_socket_to_native(sock), SIOCGIFADDR, &i_faces[i]) < 0) {
continue;
}

const struct sockaddr_in *addr4 = (const struct sockaddr_in *)(void *)&i_faces[i].ifr_addr;


IP4 ip4_staging;
ip4_staging.uint32 = addr4->sin_addr.s_addr;

if (ip4_is_local(&ip4_staging)) {
// this is 127.x.x.x
ip->ip.v4.uint32 = ip4_staging.uint32;
} else {
// give up.
continue;
}
}

++broadcast->count;
Expand Down

0 comments on commit d9b8fa6

Please sign in to comment.