summaryrefslogtreecommitdiff
path: root/libgssdp
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 /libgssdp
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
Diffstat (limited to 'libgssdp')
-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;
}
}