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

Martin Doucha mdoucha@suse.cz
Tue Sep 29 18:16:39 CEST 2026


Hi,
one suggestion below.

On 9/29/26 16:15, Andrea Cervesato wrote:
> From: Andrea Cervesato <andrea.cervesato@suse.com>
> 
> Empty string module parameters return EOF on older kernels, 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.
> 
> 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
> ---
>   lib/tst_sys_conf.c | 27 ++++++++++++++++++++++-----
>   1 file changed, 22 insertions(+), 5 deletions(-)
> 
> diff --git a/lib/tst_sys_conf.c b/lib/tst_sys_conf.c
> index 80cd83569..a62af4a94 100644
> --- a/lib/tst_sys_conf.c
> +++ b/lib/tst_sys_conf.c
> @@ -56,6 +56,7 @@ int tst_sys_conf_save(const struct tst_path_val *conf)
>   {
>   	char line[PATH_MAX];
>   	int ttype, iret;
> +	int read_err, saved_errno;
>   	FILE *fp;
>   	void *ret;
>   
> @@ -93,14 +94,23 @@ int tst_sys_conf_save(const struct tst_path_val *conf)
>   	}
>   
>   	ret = fgets(line, sizeof(line), fp);
> +	saved_errno = errno;
> +	read_err = ferror(fp);
> +
>   	fclose(fp);
>   
>   	if (ret == NULL) {
> -		if (conf->flags & TST_SR_IGNORE_ERR)
> -			return 1;
> +		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);
> +		}
>   
> -		tst_brk(TBROK | TERRNO, "Failed to read anything from '%s'",
> -			conf->path);
> +		/* Empty string module parameters can return EOF on older kernels. */
> +		line[0] = '\0';
>   	}
>   

I think you can drop most of this chunk and do two things instead:
1) char line[PATH_MAX] = {};
2) if (ret == NULL) -> if (read_err).

-- 
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