[v2,13/18] initscripts fkt: ignore invalid keys in readhash

Message ID 20240616160245.18865-14-jonatan.schlag@ipfire.org
State New
Headers
Series [v2,01/18] tests: Add bash lib |

Commit Message

Jonatan Schlag June 16, 2024, 4:02 p.m. UTC
  Signed-off-by: Jonatan Schlag <jonatan.schlag@ipfire.org>
---
 src/initscripts/system/functions              |  6 ++++++
 tests/src/initscripts/system/functions/data/2 | 20 +++++++++++++++++++
 .../system/functions/data/2_output_stderr     |  4 ++++
 .../system/functions/data/2_output_stdout     |  0
 .../src/initscripts/system/functions/test.sh  | 16 +++++++++++++++
 5 files changed, 46 insertions(+)
 create mode 100644 tests/src/initscripts/system/functions/data/2
 create mode 100644 tests/src/initscripts/system/functions/data/2_output_stderr
 create mode 100644 tests/src/initscripts/system/functions/data/2_output_stdout
  

Patch

diff --git a/src/initscripts/system/functions b/src/initscripts/system/functions
index 6107463fc..bbcfab95d 100644
--- a/src/initscripts/system/functions
+++ b/src/initscripts/system/functions
@@ -914,6 +914,12 @@  readhash() {
 		local key="${line%=*}"
 		local val="${line#*=}"
 
+		# Skip lines with an invalid key
+		if ! [[ ${key} =~ ^[A-Za-z_][A-Za-z0-9_]*$ ]]; then
+			echo "Invalid key '${key}'" >&2
+			continue
+		fi
+
 		printf -v "${array}[${key}]" "%s" "${val}"
 	done < "${file}"
 }
diff --git a/tests/src/initscripts/system/functions/data/2 b/tests/src/initscripts/system/functions/data/2
new file mode 100644
index 000000000..3e1a7028b
--- /dev/null
+++ b/tests/src/initscripts/system/functions/data/2
@@ -0,0 +1,20 @@ 
+CONFIG_TYPE=3
+GREEN_DEV=green0
+GREEN_MACADDR=00:c0:08:8a:a0:47
+GREEN_DRIVER=r8175
+-RED_DEV=red0
+RE??D_MACADDR=00:c0:08:8a:a0:56
+RED&&_DRIVER=r8283
+# Another Comment
+0BLUE_DEV='blue0 net0'
+BLUE_MACADDR=bc:30:7d:58:6b:e3
+BLUE_DRIVER=rt2800
+RED_DHCP_HOSTNAME=ipfire
+RED_DHCP_FORCE_MTU=
+RED_ADDRESS=0.0.0.0
+RED_NETMASK=0.0.0.0
+RED_TYPE=PPPOE
+RED_NETADDRESS=0.0.0.0
+
+# Comment for testing  
+    # Comment for testing Comments with spaces before
diff --git a/tests/src/initscripts/system/functions/data/2_output_stderr b/tests/src/initscripts/system/functions/data/2_output_stderr
new file mode 100644
index 000000000..dfcf2154b
--- /dev/null
+++ b/tests/src/initscripts/system/functions/data/2_output_stderr
@@ -0,0 +1,4 @@ 
+Invalid key '-RED_DEV'
+Invalid key 'RE??D_MACADDR'
+Invalid key 'RED&&_DRIVER'
+Invalid key '0BLUE_DEV'
diff --git a/tests/src/initscripts/system/functions/data/2_output_stdout b/tests/src/initscripts/system/functions/data/2_output_stdout
new file mode 100644
index 000000000..e69de29bb
diff --git a/tests/src/initscripts/system/functions/test.sh b/tests/src/initscripts/system/functions/test.sh
index 915f098a0..a2d6535a5 100755
--- a/tests/src/initscripts/system/functions/test.sh
+++ b/tests/src/initscripts/system/functions/test.sh
@@ -23,3 +23,19 @@  test_that_array_doesnt_have_key "CONFIG" "# Comment for testing Comments with sp
 
 test_that_output_is "${SCRIPT_PATH}/data/1_output_stdout" "1" readhash "CONFIG" "${SCRIPT_PATH}/data/1"
 test_that_output_is "${SCRIPT_PATH}/data/1_output_stderr" "2" readhash "CONFIG" "${SCRIPT_PATH}/data/1"
+
+# Check with invalid Lines (values and keys)
+readhash "CONFIG2" "${SCRIPT_PATH}/data/2" &> /dev/null
+
+# test if we read the correct data
+test_value_in_array "CONFIG2" "RED_DHCP_HOSTNAME" "ipfire"
+test_value_in_array "CONFIG2" "BLUE_MACADDR" "bc:30:7d:58:6b:e3"
+
+# We could do some complex checking if we would create functions to check for correct values and keys.
+# We would be then able to mock these function and check if they are correctly called and if the data
+# does not end up in our array.
+# I think the more simpler way of checking the logged errors is the fastes way here.
+test_that_output_is "${SCRIPT_PATH}/data/2_output_stdout" "1" readhash "CONFIG2" "${SCRIPT_PATH}/data/2"
+test_that_output_is "${SCRIPT_PATH}/data/2_output_stderr" "2" readhash "CONFIG2" "${SCRIPT_PATH}/data/2"
+
+