On 21/01/2021 14:20, Pali Rohár wrote:
> Hello!
> 
> On Thursday 21 January 2021 14:00:10 Matthias May wrote:
>> On Linux when IPv6 is disabled, one would not expect Dnsmasq to bind
>> the IPv6 wildcard.
> 
> And it is a problem? I would expect that if IPv6 is disabled then
> applications (including dnsmasq) cannot bind to the IPv6 address for
> listening... Or can applications bind to IPv6 address also when IPv6 is
> disabled? I just have not caught what is the problem (from description).
> 

Well not a problem per se, but i was quite surprised to see dnsmasq binding :: 
with IPv6 disabled.
Yes it seems to be possible to bind :: while IPv6 is disabled.

See the previous discussion on this list at:
https://www.mail-archive.com/dnsmasq-discuss@lists.thekelleys.org.uk/msg14032.html

>> This patch adds a condition to the wildcard bind function, which checks
>> on Linux if IPv6 is disabled.
>>
>> Signed-off-by: Matthias May <matthias....@westermo.com>
>> Signed-off-by: Zefir Kurtisi <zefir.kurt...@westermo.com>
>> ---
>>  src/dnsmasq.h |  1 +
>>  src/network.c | 24 +++++++++++++-----------
>>  src/util.c    | 22 ++++++++++++++++++++++
>>  3 files changed, 36 insertions(+), 11 deletions(-)
>>
>> diff --git a/src/dnsmasq.h b/src/dnsmasq.h
>> index 4220798..2cfb1cb 100644
>> --- a/src/dnsmasq.h
>> +++ b/src/dnsmasq.h
>> @@ -1292,6 +1292,7 @@ int read_write(int fd, unsigned char *packet, int 
>> size, int rw);
>>  void close_fds(long max_fd, int spare1, int spare2, int spare3);
>>  int wildcard_match(const char* wildcard, const char* match);
>>  int wildcard_matchn(const char* wildcard, const char* match, int num);
>> +int is_ipv6_disabled(void);
>>  #ifdef HAVE_LINUX_NETWORK
>>  int kernel_version(void);
>>  #endif
>> diff --git a/src/network.c b/src/network.c
>> index c7d002b..0d35fb7 100644
>> --- a/src/network.c
>> +++ b/src/network.c
>> @@ -990,19 +990,21 @@ void create_wildcard_listeners(void)
>>
>>    l = create_listeners(&addr, !!option_bool(OPT_TFTP), 1);
>>
>> -  memset(&addr, 0, sizeof(addr));
>> +  if (!is_ipv6_disabled()) {
>> +    memset(&addr, 0, sizeof(addr));
>>  #ifdef HAVE_SOCKADDR_SA_LEN
>> -  addr.in6.sin6_len = sizeof(addr.in6);
>> +    addr.in6.sin6_len = sizeof(addr.in6);
>>  #endif
>> -  addr.in6.sin6_family = AF_INET6;
>> -  addr.in6.sin6_addr = in6addr_any;
>> -  addr.in6.sin6_port = htons(daemon->port);
>> -
>> -  l6 = create_listeners(&addr, !!option_bool(OPT_TFTP), 1);
>> -  if (l)
>> -    l->next = l6;
>> -  else
>> -    l = l6;
>> +    addr.in6.sin6_family = AF_INET6;
>> +    addr.in6.sin6_addr = in6addr_any;
>> +    addr.in6.sin6_port = htons(daemon->port);
>> +
>> +    l6 = create_listeners(&addr, !!option_bool(OPT_TFTP), 1);
>> +    if (l)
>> +      l->next = l6;
>> +    else
>> +      l = l6;
>> +  }
>>
>>    daemon->listeners = l;
>>  }
>> diff --git a/src/util.c b/src/util.c
>> index 5f13027..5cd461f 100644
>> --- a/src/util.c
>> +++ b/src/util.c
>> @@ -787,6 +787,28 @@ int wildcard_matchn(const char* wildcard, const char* 
>> match, int num)
>>    return (!num) || (*wildcard == *match);
>>  }
>>
>> +#ifndef HAVE_LINUX_NETWORK
>> +/* implement for other platforms */
>> +int is_ipv6_disabled(void)
>> +{
>> +    return 0;
>> +}
>> +#else /* HAVE_LINUX_NETWORK */
>> +int is_ipv6_disabled(void)
>> +{
>> +    FILE *f;
>> +    char *fname = "/proc/sys/net/ipv6/conf/all/disable_ipv6";
>> +    char buf[4];
>> +    int ipv6_disabled = 0;
>> +    if ((f = fopen(fname, "r"))) {
>> +            if (fgets(buf, 4, f))
>> +                    ipv6_disabled = atoi(buf) == 1;
>> +            fclose(f);
>> +    }
>> +    return ipv6_disabled;
> 
> This check is incorrect. If IPv6 support is disabled at kernel compile
> time then fopen() fails and this function returns 0, meaning IPv6 is
> enabled.

True.
Although when IPv6 support is not even compiled in, i would guess that the 
attempt to bind :: will also fail.
Functionally i don't see a difference.
But you are right, the function isn't doing what its name says.
Will send a v2.

> 
>> +}
>> +#endif /* HAVE_LINUX_NETWORK */
>> +
>>  #ifdef HAVE_LINUX_NETWORK
>>  int kernel_version(void)
>>  {
>> -- 
>> 2.27.0
>>
>> _______________________________________________
>> Dnsmasq-discuss mailing list
>> Dnsmasq-discuss@lists.thekelleys.org.uk
>> https://urldefense.com/v3/__http://lists.thekelleys.org.uk/mailman/listinfo/dnsmasq-discuss__;!!I9LPvj3b!Tm5sQkbTBCVA0WatEAaSi5Dn2ao9xNGjrzD85qAFtb8F6NfsJiCwHQogwebRlh5_cp8$
>>  
> 

BR
Matthias

_______________________________________________
Dnsmasq-discuss mailing list
Dnsmasq-discuss@lists.thekelleys.org.uk
http://lists.thekelleys.org.uk/mailman/listinfo/dnsmasq-discuss

Reply via email to