[LTP] [PATCH v2] lib: Handle empty saved configuration values

Andrea Cervesato andrea.cervesato@suse.de
Wed Sep 30 09:43:08 CEST 2026


From: Andrea Cervesato <andrea.cervesato@suse.com>

Empty string module parameters return EOF on kernels prior to 4.14
commit 96802e6b1dbf ("kernel/params.c: fix an overflow in
param_attr_show"), causing fw_load02 to abort with TBROK on v4.4.

Accept empty values while retaining read-error handling and the original
errno. Restore empty strings with a NUL byte: an empty write does not
invoke the sysfs setter, while a newline would change the saved value.

Reviewed-by: Cyril Hrubis <chrubis@suse.cz>
Reviewed-by: Petr Vorel <pvorel@suse.cz>
Signed-off-by: Andrea Cervesato <andrea.cervesato@suse.com>
---
Fix the following behaviour on kernel < 4.14 96802e6b1dbf

tst_kconfig.c:90: TINFO: Parsing kernel config '/proc/config.gz'
tst_kconfig.c:90: TINFO: Parsing kernel config '/proc/config.gz'
tst_kconfig.c:90: TINFO: Parsing kernel config '/proc/config.gz'
tst_security.c:115: TINFO: SecureBoot sysfs file not available
tst_security.c:94: TINFO: Unable to determine system lockdown state
tst_security.c:115: TINFO: SecureBoot sysfs file not available
tst_tmpdir.c:309: TINFO: Using /tmp/LTP_fw_ZRzLML as tmpdir (btrfs filesystem)
tst_sys_conf.c:103: TBROK: Failed to read anything from '/sys/module/firmware_class/parameters/path': SUCCESS (0)

Summary:
passed   0
failed   0
broken   1
skipped  0
warnings 0
---
Changes in v2:
- fix commit message
- fix according to Martin's suggestion
- Link to v1: https://lore.kernel.org/20260929-fix_fw_load02-v1-1-4cd5f95d172b@suse.com
---
 lib/tst_sys_conf.c | 21 ++++++++++++++++-----
 1 file changed, 16 insertions(+), 5 deletions(-)

diff --git a/lib/tst_sys_conf.c b/lib/tst_sys_conf.c
index 80cd83569..f69eb3c7f 100644
--- a/lib/tst_sys_conf.c
+++ b/lib/tst_sys_conf.c
@@ -54,10 +54,10 @@ void tst_sys_conf_save_str(const char *path, const char *value)
 
 int tst_sys_conf_save(const struct tst_path_val *conf)
 {
-	char line[PATH_MAX];
+	char line[PATH_MAX] = {};
 	int ttype, iret;
+	int read_err = 0, saved_errno = 0;
 	FILE *fp;
-	void *ret;
 
 	if (!conf || !conf->path)
 		tst_brk(TBROK, "path is empty");
@@ -92,13 +92,17 @@ int tst_sys_conf_save(const struct tst_path_val *conf)
 		return 1;
 	}
 
-	ret = fgets(line, sizeof(line), fp);
+	if (!fgets(line, sizeof(line), fp))
+		read_err = ferror(fp);
+
+	saved_errno = errno;
 	fclose(fp);
 
-	if (ret == NULL) {
+	if (read_err) {
 		if (conf->flags & TST_SR_IGNORE_ERR)
 			return 1;
 
+		errno = saved_errno;
 		tst_brk(TBROK | TERRNO, "Failed to read anything from '%s'",
 			conf->path);
 	}
@@ -142,7 +146,14 @@ void tst_sys_conf_restore(int verbose)
 			tst_res(TINFO, "Restoring conf.: %s -> %s\n",
 				i->path, i->value);
 		}
-		FILE_PRINTF(i->path, "%s", i->value);
+		/*
+		 * A zero-length write does not invoke the sysfs store callback.
+		 * Write a NUL byte to restore an empty string module parameter.
+		 */
+		if (!i->value[0])
+			FILE_PRINTF(i->path, "%c", '\0');
+		else
+			FILE_PRINTF(i->path, "%s", i->value);
 	}
 }
 

---
base-commit: 1cbe713ca9d55bed7e4d52c6f2216ba3e2089346
change-id: 20260929-fix_fw_load02-6b0305f6bd7b

Best regards,
--  
Andrea Cervesato <andrea.cervesato@suse.com>



More information about the ltp mailing list