summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJens Georg <mail@jensge.org>2022-09-18 08:50:45 +0200
committerJens Georg <mail@jensge.org>2022-11-02 16:36:49 +0100
commit0c8f2bb00226d28303e6081a122d7e958f361ea0 (patch)
tree0dd1b839c7a8523b1a2394b8ea2373a2e72eeed4
parent8cc494c20575ae9be48d186407749805209c0f46 (diff)
downloadgssdp-0c8f2bb00226d28303e6081a122d7e958f361ea0.tar.gz
client: Do not accept multicast packets on lo
Revert accidental revert 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;
}
}