[PATCH i-g-t 2/3] lib/igt_sysfs: make sure to write empty strings
Janusz Krzysztofik
janusz.krzysztofik at linux.intel.com
Thu Feb 1 13:15:53 UTC 2024
On Thursday, 1 February 2024 01:50:29 CET Lucas De Marchi wrote:
> echo -n "" > /sys/module/<modulename>/parameters/<param>
>
> doesn't really work as it will just create a open() + close() expecting
> the file to be truncated. The same issue happens with igt as it will
> stop writing when there are 0 chars to write. Special case the empty
> string so it always write a '\0' and make sure igt_sysfs_set() accounts
> for the extra null char.
>
> Shell example:
> # echo -n "/foo" > /sys/module/firmware_class/parameters/path
> # cat /sys/module/firmware_class/parameters/path
> /foo
> # echo -n "" > /sys/module/firmware_class/parameters/path
> /foo
> # # make sure to actually write a \0:
> echo -ne "\0" > /sys/module/firmware_class/parameters/path
> # cat /sys/module/firmware_class/parameters/path
> /foo
Still not overwritten? Isn't that a mistake?
>
> Same thing happens when testing igt_sysfs_set():
> int dirfd = open("/sys/module/firmware_class/parameters", O_RDONLY);
> igt_sysfs_set(dirfd, "path", "");
>
> Previously it was not really setting the param.
>
> Signed-off-by: Lucas De Marchi <lucas.demarchi at intel.com>
> ---
> lib/igt_sysfs.c | 12 ++++++++++--
> 1 file changed, 10 insertions(+), 2 deletions(-)
>
> diff --git a/lib/igt_sysfs.c b/lib/igt_sysfs.c
> index 567b4f6d5..814220ddb 100644
> --- a/lib/igt_sysfs.c
> +++ b/lib/igt_sysfs.c
> @@ -406,7 +406,7 @@ int igt_sysfs_read(int dir, const char *attr, void
*data, int len)
> */
> bool igt_sysfs_set(int dir, const char *attr, const char *value)
> {
> - int len = strlen(value);
> + int len = strlen(value) + 1;
> return igt_sysfs_write(dir, attr, value, len) == len;
> }
>
> @@ -513,8 +513,16 @@ int igt_sysfs_vprintf(int dir, const char *attr, const
char *fmt, va_list ap)
> return -errno;
>
> va_copy(tmp, ap);
> - ret = vsnprintf(buf, sizeof(stack), fmt, tmp);
> + ret = vsnprintf(stack, sizeof(stack), fmt, tmp);
Looks not related.
> va_end(tmp);
> +
> + /*
> + * make sure to always issue a write() syscall, even if writing an
empty string,
> + * otherwise values in sysfs like module parameters don't really get
overwritten
> + */
> + if (igt_debug_on(ret = 0))
> + return igt_writen(fd, "", 1);
I think users may know that an empty string is going to be written, then may
expect return value of 0, not 1. Also, what value should we return to the
user if (unlikely) we got 0 from igt_writen()? write(2) says: "If count is
zero and fd refers to a file other than a regular file, the results are not
specified."
While resolving two instances of one and the same issue, you use two different
approaches:
1) always increase the number of characters to be written by 1 when writing
strings, so at least the terminating null byte is always written,
2) divert to a separate call to igt_writen() that writes just the terminating
null byte when the string to be written is empty.
While both methods can work correctly, I think it would be more clear if you
selected one of them and stuck to it, or provide a justification if not.
Thanks,
Janusz
> +
> if (igt_debug_on(ret < 0))
> return -EINVAL;
>
>
More information about the igt-dev
mailing list