From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from firstgate.proxmox.com (firstgate.proxmox.com [212.224.123.68]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by lists.proxmox.com (Postfix) with ESMTPS id 60BB5609E4 for ; Thu, 13 Aug 2020 15:03:22 +0200 (CEST) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id 4921B1AAFA for ; Thu, 13 Aug 2020 15:02:52 +0200 (CEST) Received: from proxmox-new.maurer-it.com (proxmox-new.maurer-it.com [212.186.127.180]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits)) (No client certificate requested) by firstgate.proxmox.com (Proxmox) with ESMTPS id 8BC751AAF1 for ; Thu, 13 Aug 2020 15:02:51 +0200 (CEST) Received: from proxmox-new.maurer-it.com (localhost.localdomain [127.0.0.1]) by proxmox-new.maurer-it.com (Proxmox) with ESMTP id 3F420445EB for ; Thu, 13 Aug 2020 15:02:51 +0200 (CEST) From: Fabian Ebner To: pve-devel@lists.proxmox.com Date: Thu, 13 Aug 2020 15:02:45 +0200 Message-Id: <20200813130245.17990-1-f.ebner@proxmox.com> X-Mailer: git-send-email 2.20.1 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-SPAM-LEVEL: Spam detection results: 0 AWL 0.003 Adjusted score from AWL reputation of From: address KAM_DMARC_STATUS 0.01 Test Rule for DKIM or SPF Failure with Strict Alignment RCVD_IN_DNSWL_MED -2.3 Sender listed at https://www.dnswl.org/, medium trust SPF_HELO_NONE 0.001 SPF: HELO does not publish an SPF Record SPF_PASS -0.001 SPF: sender matches SPF record Subject: [pve-devel] [PATCH v2 proxmox-backup] Fix #2926: parse_iface_attributes: always break on non-{attribitue, comment} token X-BeenThere: pve-devel@lists.proxmox.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: Proxmox VE development discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 13 Aug 2020 13:03:22 -0000 There is no requirement to have at least a blank line, attribute or comment in between two interface definitions, e.g. iface lo inet loopback iface lo inet6 loopback Signed-off-by: Fabian Ebner --- Changes from v1: * Add tests as Dietmar suggested src/config/network.rs | 97 ++++++++++++++++++++++++++++++++++++ src/config/network/parser.rs | 4 +- 2 files changed, 98 insertions(+), 3 deletions(-) diff --git a/src/config/network.rs b/src/config/network.rs index c217141f..02d0713c 100644 --- a/src/config/network.rs +++ b/src/config/network.rs @@ -600,4 +600,101 @@ mod test { Ok(()) } + + #[test] + fn test_network_config_create_no_blank_1() -> Result<(), Error> { + let input = "auto lo\n\ + iface lo inet loopback\n\ + iface lo inet6 loopback\n\ + auto ens18\n\ + iface ens18 inet static\n\ + \taddress 192.168.20.144/20\n\ + \tgateway 192.168.16.1\n\ + # comment\n\ + iface ens20 inet static\n\ + \taddress 192.168.20.145/20\n\ + iface ens21 inet manual\n\ + iface ens22 inet manual\n"; + + let mut parser = NetworkParser::new(&input.as_bytes()[..]); + + let config = parser.parse_interfaces(None)?; + + let output = String::try_from(config)?; + + let expected = "auto lo\n\ + iface lo inet loopback\n\ + \n\ + iface lo inet6 loopback\n\ + \n\ + auto ens18\n\ + iface ens18 inet static\n\ + \taddress 192.168.20.144/20\n\ + \tgateway 192.168.16.1\n\ + #comment\n\ + \n\ + iface ens20 inet static\n\ + \taddress 192.168.20.145/20\n\ + \n\ + iface ens21 inet manual\n\ + \n\ + iface ens22 inet manual\n\ + \n"; + assert_eq!(output, expected); + + Ok(()) + } + + #[test] + fn test_network_config_create_no_blank_2() -> Result<(), Error> { + // Adapted from bug 2926 + let input = "### Hetzner Online GmbH installimage\n\ + \n\ + source /etc/network/interfaces.d/*\n\ + \n\ + auto lo\n\ + iface lo inet loopback\n\ + iface lo inet6 loopback\n\ + \n\ + auto enp4s0\n\ + iface enp4s0 inet static\n\ + \taddress 10.10.10.10/24\n\ + \tgateway 10.10.10.1\n\ + \t# route 10.10.20.10/24 via 10.10.20.1\n\ + \tup route add -net 10.10.20.10 netmask 255.255.255.0 gw 10.10.20.1 dev enp4s0\n\ + \n\ + iface enp4s0 inet6 static\n\ + \taddress fe80::5496:35ff:fe99:5a6a/64\n\ + \tgateway fe80::1\n"; + + let mut parser = NetworkParser::new(&input.as_bytes()[..]); + + let config = parser.parse_interfaces(None)?; + + let output = String::try_from(config)?; + + let expected = "### Hetzner Online GmbH installimage\n\ + \n\ + source /etc/network/interfaces.d/*\n\ + \n\ + auto lo\n\ + iface lo inet loopback\n\ + \n\ + iface lo inet6 loopback\n\ + \n\ + auto enp4s0\n\ + iface enp4s0 inet static\n\ + \taddress 10.10.10.10/24\n\ + \tgateway 10.10.10.1\n\ + \t# route 10.10.20.10/24 via 10.10.20.1\n\ + \tup route add -net 10.10.20.10 netmask 255.255.255.0 gw 10.10.20.1 dev enp4s0\n\ + \n\ + iface enp4s0 inet6 static\n\ + \taddress fe80::5496:35ff:fe99:5a6a/64\n\ + \tgateway fe80::1\n\ + \n"; + assert_eq!(output, expected); + + Ok(()) + } } diff --git a/src/config/network/parser.rs b/src/config/network/parser.rs index 071bbcc7..a97d0f79 100644 --- a/src/config/network/parser.rs +++ b/src/config/network/parser.rs @@ -210,9 +210,7 @@ impl NetworkParser { self.eat(Token::Newline)?; continue; } - Token::Newline => break, - Token::EOF => break, - unexpected => bail!("unexpected token {:?} (expected iface attribute)", unexpected), + _ => break, } match self.peek()? { -- 2.20.1