From 725e3f9f0c401aa34bb0d3d01bb8119797d038f7 Mon Sep 17 00:00:00 2001
From: "A. Wilcox" <AWilcox@Wilcox-Tech.com>
Date: Thu, 24 Oct 2019 01:29:29 -0500
Subject: hscript: Ensure netaddress iface name is < IFNAMSIZ

---
 hscript/network.cc                                       | 7 +++++++
 tests/fixtures/0130-netaddress-invalid-iface.installfile | 6 ++++++
 tests/spec/validator_spec.rb                             | 5 +++++
 3 files changed, 18 insertions(+)
 create mode 100644 tests/fixtures/0130-netaddress-invalid-iface.installfile

diff --git a/hscript/network.cc b/hscript/network.cc
index b751e7e..e8f27b9 100644
--- a/hscript/network.cc
+++ b/hscript/network.cc
@@ -62,6 +62,13 @@ Key *NetAddress::parseFromData(const std::string &data, int lineno, int *errors,
 
     type_pos = data.find_first_of(' ');
     iface = data.substr(0, type_pos);
+    if(iface.length() > IFNAMSIZ) {
+        if(errors) *errors += 1;
+        output_error("installfile:" + std::to_string(lineno),
+                     "netaddress: interface name '" + iface + "' is invalid",
+                     "interface names must be 16 characters or less");
+        return nullptr;
+    }
     /* theory: addr_pos could be npos, but that means 'read to end' anyway */
     addr_pos = data.find_first_of(' ', type_pos + 1);
     if(addr_pos == std::string::npos) next_end = std::string::npos;
diff --git a/tests/fixtures/0130-netaddress-invalid-iface.installfile b/tests/fixtures/0130-netaddress-invalid-iface.installfile
new file mode 100644
index 0000000..e641c26
--- /dev/null
+++ b/tests/fixtures/0130-netaddress-invalid-iface.installfile
@@ -0,0 +1,6 @@
+network false
+hostname test.machine
+pkginstall adelie-base
+rootpw $6$gumtLGmHwOVIRpQR$2M9PUO24hy5mofzWWf9a.YLbzOgOlUby1g0hDj.wG67E2wrrvys59fq02PPdxBdbgkLZFtjfEx6MHZwMBamwu/
+mount /dev/sda1 /
+netaddress enP20p36s15f10d16 dhcp
diff --git a/tests/spec/validator_spec.rb b/tests/spec/validator_spec.rb
index 624eaa2..b07e383 100644
--- a/tests/spec/validator_spec.rb
+++ b/tests/spec/validator_spec.rb
@@ -293,6 +293,11 @@ RSpec.describe 'HorizonScript validation', :type => :aruba do
                     run_validate
                     expect(last_command_started).to have_output(/error: .*netaddress.*require/)
                 end
+                it "fails with invalid interface name" do
+                    use_fixture '0130-netaddress-invalid-iface.installfile'
+                    run_validate
+                    expect(last_command_started).to have_output(/error: .*netaddress.*interface/)
+                end
                 # Runner.Validate.netaddress.Validity.Type.
                 it "fails on invalid address type" do
                     use_fixture '0037-netaddress-invalid-type.installfile'
-- 
cgit v1.2.3-70-g09d2