[LTP] [PATCH v2] lib: Handle empty saved configuration values
Martin Doucha
mdoucha@suse.cz
Wed Sep 30 13:05:04 CEST 2026
Hi,
looks good.
Reviewed-by: Martin Doucha <mdoucha@suse.cz>
On 9/30/26 09:43, Andrea Cervesato wrote:
> 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>
>
>
--
Martin Doucha mdoucha@suse.cz
SW Quality Engineer
SUSE LINUX, s.r.o.
CORSO IIa
Krizikova 148/34
186 00 Prague 8
Czech Republic
More information about the ltp
mailing list