[pve-devel] [PATCH common v3 2/2] Fix #1234: allows multiple search domains to be set
Emmanuel Kasper
e.kasper at proxmox.com
Thu Apr 13 11:21:50 CEST 2017
Changes:
* multiple 'search' entries (up to 6) can be now read and added like the
libc resolver
* a 'search' entry list of more that 255 characters will be silently skipped,
like the libc resolver
When multiple 'domain' entries are defined, only the first one is matched, similar to
previous behaviour and libc.
---
src/PVE/INotify.pm | 25 ++++++++++++++++++++-----
1 file changed, 20 insertions(+), 5 deletions(-)
diff --git a/src/PVE/INotify.pm b/src/PVE/INotify.pm
index 074f8b3..7cbfb64 100644
--- a/src/PVE/INotify.pm
+++ b/src/PVE/INotify.pm
@@ -19,6 +19,7 @@ use Clone qw(clone);
use Linux::Inotify2;
use base 'Exporter';
use JSON;
+use English;
our @EXPORT_OK = qw(read_file write_file register_file);
@@ -539,15 +540,29 @@ sub read_etc_resolv_conf {
my $nscount = 0;
while (my $line = <$fh>) {
chomp $line;
- # resolv.conf should *either* have a search or domain, else behaviour is undefined
- # see res_init.c in libc, havesearch is set to 0 when a domain entry is found
- if ($line =~ m/^(search|domain)\s+(\S+)\s*/) {
- $res->{search} = $2;
- } elsif ($line =~ m/^\s*nameserver\s+($PVE::Tools::IPRE)\s*/) {
+ # resolv.conf should *either* have a search or domain, else
+ # last one found wins, see resolv.conf(5)
+ if ($line =~ m/^domain\s+(?<local_domain>\S+)\s*/) {
+ $res->{search} = $LAST_PAREN_MATCH{local_domain};
+ next;
+ }
+
+ # up to 6 domains and 256 characters in the domain list, minus \0
+ if ($line =~ /^search\s+(?<search_list>\S+(\s+\S+){0,5})\s*$/) {
+ if (length($LAST_PAREN_MATCH{search_list}) > 255) {
+ delete $res->{search}; #last one wins, even if empty
+ } else {
+ $res->{search} = $LAST_PAREN_MATCH{search_list};
+ }
+ next;
+ }
+
+ if ($line =~ m/^\s*nameserver\s+($PVE::Tools::IPRE)\s*/) {
$nscount++;
if ($nscount <= 3) {
$res->{"dns$nscount"} = $1;
}
+ next;
}
}
--
2.1.4
More information about the pve-devel
mailing list