594167
From fb51d78042fec1a2df2a7da1f9a759875bd7e07e Mon Sep 17 00:00:00 2001
594167
From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl>
594167
Date: Tue, 8 Mar 2022 11:38:46 +0100
594167
Subject: [PATCH] shared/specifier: clarify and add test for missing data
594167
594167
In systemd.unit we document that unset fields resolve to "". But we didn't
594167
directly test this, so let's do that. Also, we return -ENOENT if the file
594167
is missing, which we didn't document or test.
594167
594167
(cherry picked from commit 7962116fc8a2572c5c89904ac50fe99c8101f28f)
594167
594167
Related: #2082131
594167
---
594167
 src/shared/specifier.c    |  4 +++-
594167
 src/test/test-specifier.c | 14 ++++++++++++++
594167
 2 files changed, 17 insertions(+), 1 deletion(-)
594167
594167
diff --git a/src/shared/specifier.c b/src/shared/specifier.c
594167
index f8ab98541f..c26628975c 100644
594167
--- a/src/shared/specifier.c
594167
+++ b/src/shared/specifier.c
594167
@@ -213,7 +213,9 @@ int specifier_architecture(char specifier, const void *data, const char *root, c
594167
 }
594167
 
594167
 /* Note: fields in /etc/os-release might quite possibly be missing, even if everything is entirely valid
594167
- * otherwise. We'll return an empty value or NULL in that case from the functions below. */
594167
+ * otherwise. We'll return an empty value or NULL in that case from the functions below. But if the
594167
+ * os-release file is missing, we'll return -ENOENT. This means that something is seriously wrong with the
594167
+ * installation. */
594167
 
594167
 int specifier_os_id(char specifier, const void *data, const char *root, const void *userdata, char **ret) {
594167
         return parse_os_release(root, "ID", ret);
594167
diff --git a/src/test/test-specifier.c b/src/test/test-specifier.c
594167
index dda993ce9d..790f0252d7 100644
594167
--- a/src/test/test-specifier.c
594167
+++ b/src/test/test-specifier.c
594167
@@ -96,4 +96,18 @@ TEST(specifiers) {
594167
         }
594167
 }
594167
 
594167
+TEST(specifiers_missing_data_ok) {
594167
+        _cleanup_free_ char *resolved = NULL;
594167
+
594167
+        assert_se(setenv("SYSTEMD_OS_RELEASE", "/dev/null", 1) == 0);
594167
+        assert_se(specifier_printf("%A-%B-%M-%o-%w-%W", SIZE_MAX, specifier_table, NULL, NULL, &resolved) >= 0);
594167
+        assert_se(streq(resolved, "-----"));
594167
+
594167
+        assert_se(setenv("SYSTEMD_OS_RELEASE", "/nosuchfileordirectory", 1) == 0);
594167
+        assert_se(specifier_printf("%A-%B-%M-%o-%w-%W", SIZE_MAX, specifier_table, NULL, NULL, &resolved) == -ENOENT);
594167
+        assert_se(streq(resolved, "-----"));
594167
+
594167
+        assert_se(unsetenv("SYSTEMD_OS_RELEASE") == 0);
594167
+}
594167
+
594167
 DEFINE_TEST_MAIN(LOG_DEBUG);