summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJens Georg <mail@jensge.org>2022-09-18 08:50:45 +0200
committerJens Georg <mail@jensge.org>2022-09-18 08:50:45 +0200
commit7ecb930d93714b34e751d63a1db47028a2bbf7fe (patch)
treedce1f8923b32a8797d31f46011784b91988cece7
parent6eeaf27aec6ff11f325ff633b52bd56dbc1435aa (diff)
downloadgssdp-7ecb930d93714b34e751d63a1db47028a2bbf7fe.tar.gz
client: Do not accept multicast packets on lo
All multicast packets are also received on lo. If we answer those, we cause the remote site to receive locations for the wrong addresses on their lo interface. This was added because of missing announcements previously, not sure what exactly has changed since then Fixes #24
-rw-r--r--libgssdp/gssdp-client.c26
1 files changed, 18 insertions, 8 deletions
diff --git a/libgssdp/gssdp-client.c b/libgssdp/gssdp-client.c
index 60aeb06..a81f81d 100644
--- a/libgssdp/gssdp-client.c
+++ b/libgssdp/gssdp-client.c
@@ -1726,19 +1726,29 @@ socket_source_cb (GSSDPSocketSource *socket_source, GSSDPClient *client)
msg = GSSDP_PKTINFO6_MESSAGE (messages[i]);
msg_ifindex = gssdp_pktinfo6_message_get_ifindex (msg);
local_addr = gssdp_pktinfo6_message_get_local_addr (msg);
- } else
+ } else {
continue;
+ }
/* message needs to be on correct interface or on
* loopback (as kernel can be smart and route things
* there even if sent to another network) */
- if (!((msg_ifindex == priv->device.index ||
- msg_ifindex == LOOPBACK_IFINDEX) &&
- (g_inet_address_equal (local_addr,
- priv->device.host_addr) ||
- g_inet_address_equal (local_addr, group_addr)))) {
- goto out;
- } else {
+ if (g_inet_address_equal (local_addr, group_addr)) {
+ // This is a multicast packet. If the index is not our index, ignore
+ if (msg_ifindex != priv->device.index) {
+ goto out;
+ }
+ break;
+ }
+
+ if (g_inet_address_equal (local_addr,
+ priv->device.host_addr)) {
+ // This is a "normal" packet. We can receive those
+
+ if (msg_ifindex != priv->device.index &&
+ msg_ifindex != LOOPBACK_IFINDEX) {
+ goto out;
+ }
break;
}
}