From: Fiona Ebner Date: Mon, 10 Jul 2023 11:36:46 +0000 (+0200) Subject: cluster config: restrict slurp scope to avoid issue parsing network interfaces X-Git-Url: https://git.proxmox.com/?a=commitdiff_plain;h=22b7ba385434a1efb7de566be67788ceafda38c5;hp=d649469164b3b39773912aa4c6184abbd27e84a4;p=pmg-api.git cluster config: restrict slurp scope to avoid issue parsing network interfaces As reported in the community forum [0], there is an edge case, where querying the network interfaces would not work. In particular, this could happen if the hostname cannot be resolved to a non-loopback IP (when installing PMG on Debian and forgetting to adapt /etc/hosts for example). The issue manifested as follows: - When setting up the RESTEnvironemnt, the cluster config is read. - This reader uses slurp mode by setting the line ending to undef locally. - But the subroutine call PVE::Network::get_local_ip() is still part of that local context. - When resolving the hostname to a non-loopback IP address failed, the function would read (via the PVE::INotify module) the network interfaces file. - As part of that, /proc/net/dev was read all at once, while the interface parsing code expects it line-by-line. - The result for reading network interfaces was cached without having detected the interfaces in /proc/net/dev. - When a new request came in, the cached result was used (even changing the file to invalidate the cache would only work as long as the cluster config file exists, because otherwise, there would be an attempt to read the cluster config which would read the updated version of the interfaces file while slurping again). [0]: https://forum.proxmox.com/threads/129958/ Signed-off-by: Fiona Ebner --- diff --git a/src/PMG/ClusterConfig.pm b/src/PMG/ClusterConfig.pm index 77b9e60..c52508d 100644 --- a/src/PMG/ClusterConfig.pm +++ b/src/PMG/ClusterConfig.pm @@ -170,9 +170,7 @@ sub lock_config { sub read_cluster_conf { my ($filename, $fh) = @_; - local $/ = undef; # slurp mode - - my $raw = defined($fh) ? <$fh> : undef; + my $raw = defined($fh) ? do { local $/ = undef; <$fh> } : undef; my $cinfo = PMG::ClusterConfig::Base->parse_config($filename, $raw);