* [LTP] [PATCH v2 0/2] Fix proc parsing in newuname01
@ 2026-05-07 7:50 Cyril Hrubis
2026-05-07 7:50 ` [LTP] [PATCH v2 1/2] lib: safe_file_ops: Add SAFE_FILE_READ_STR() Cyril Hrubis
` (2 more replies)
0 siblings, 3 replies; 8+ messages in thread
From: Cyril Hrubis @ 2026-05-07 7:50 UTC (permalink / raw)
To: ltp
Turns out some of the strings in procfs can be empty (file with just a
newline) and in such case scanf("%s", ...) fails to read the file while
what we needed instead is a function that would produce an empty string.
This patchset addds such function and makes use of it in the
newuname01 test.
v2:
- added returns to safe_file_read_str()
- fixed typo in doc comment
Cyril Hrubis (2):
lib: safe_file_ops: Add SAFE_FILE_READ_STR()
syscalls: newuname01: Fix fail on empty domainname
include/tst_safe_file_ops.h | 21 +++++++++++++++
lib/safe_file_ops.c | 26 +++++++++++++++++++
.../kernel/syscalls/newuname/newuname01.c | 8 +++---
3 files changed, 51 insertions(+), 4 deletions(-)
--
2.53.0
--
Mailing list info: https://lists.linux.it/listinfo/ltp
^ permalink raw reply [flat|nested] 8+ messages in thread
* [LTP] [PATCH v2 1/2] lib: safe_file_ops: Add SAFE_FILE_READ_STR()
2026-05-07 7:50 [LTP] [PATCH v2 0/2] Fix proc parsing in newuname01 Cyril Hrubis
@ 2026-05-07 7:50 ` Cyril Hrubis
2026-05-07 8:26 ` [LTP] " linuxtestproject.agent
2026-05-07 8:29 ` [LTP] [PATCH v2 1/2] " Andrea Cervesato via ltp
2026-05-07 7:50 ` [LTP] [PATCH v2 2/2] syscalls: newuname01: Fix fail on empty domainname Cyril Hrubis
2026-05-07 8:34 ` [LTP] [PATCH v2 0/2] Fix proc parsing in newuname01 Andrea Cervesato via ltp
2 siblings, 2 replies; 8+ messages in thread
From: Cyril Hrubis @ 2026-05-07 7:50 UTC (permalink / raw)
To: ltp
Unlike the scanf("%s") this function can properly handle empty files and
in case of an empty file produces an empty string.
Signed-off-by: Cyril Hrubis <chrubis@suse.cz>
---
include/tst_safe_file_ops.h | 21 +++++++++++++++++++++
lib/safe_file_ops.c | 26 ++++++++++++++++++++++++++
2 files changed, 47 insertions(+)
diff --git a/include/tst_safe_file_ops.h b/include/tst_safe_file_ops.h
index 0d8819594..73ebd2ab8 100644
--- a/include/tst_safe_file_ops.h
+++ b/include/tst_safe_file_ops.h
@@ -14,6 +14,27 @@
safe_file_scanf(__FILE__, __LINE__, NULL, \
(path), (fmt), ## __VA_ARGS__)
+/**
+ * SAFE_FILE_READ_STR() - Reads a string from a file.
+ *
+ * Unlike scanf("%s") this function works fine with empty files or files that
+ * consist only of white spaces. In such case an empty string is stored into
+ * the supplied buffer.
+ *
+ * It's recommended to use this for various sysfs or procfs files that may be
+ * empty.
+ *
+ * @path: A path to a file.
+ * @buf: A buffer to store the string into.
+ * @buf_size: A buffer size.
+ */
+#define SAFE_FILE_READ_STR(path, buf, buf_size) \
+ safe_file_read_str(__FILE__, __LINE__, \
+ (path), (buf), (buf_size))
+
+void safe_file_read_str(const char *file, const int lineno,
+ const char *path, char *buf, size_t buf_size);
+
#define FILE_LINES_SCANF(path, fmt, ...) \
file_lines_scanf(__FILE__, __LINE__, NULL, 0,\
(path), (fmt), ## __VA_ARGS__)
diff --git a/lib/safe_file_ops.c b/lib/safe_file_ops.c
index 8314c4b1b..19da1fd97 100644
--- a/lib/safe_file_ops.c
+++ b/lib/safe_file_ops.c
@@ -160,6 +160,32 @@ void safe_file_scanf(const char *file, const int lineno,
}
}
+void safe_file_read_str(const char *file, const int lineno,
+ const char *path, char *buf, size_t buf_size)
+{
+ FILE *f;
+
+ f = fopen(path, "r");
+ if (!f) {
+ tst_brkm_(file, lineno, TBROK | TERRNO, NULL,
+ "Failed to open FILE '%s' for reading", path);
+ return;
+ }
+
+ if (!fgets(buf, buf_size, f))
+ buf[0] = 0;
+
+ size_t len = strlen(buf);
+
+ if (len && buf[len-1] == '\n')
+ buf[len-1] = 0;
+
+ if (fclose(f)) {
+ tst_brkm_(file, lineno, TBROK | TERRNO, NULL,
+ "Failed to close FILE '%s'", path);
+ return;
+ }
+}
/*
* Try to parse each line from file specified by 'path' according
--
2.53.0
--
Mailing list info: https://lists.linux.it/listinfo/ltp
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [LTP] [PATCH v2 2/2] syscalls: newuname01: Fix fail on empty domainname
2026-05-07 7:50 [LTP] [PATCH v2 0/2] Fix proc parsing in newuname01 Cyril Hrubis
2026-05-07 7:50 ` [LTP] [PATCH v2 1/2] lib: safe_file_ops: Add SAFE_FILE_READ_STR() Cyril Hrubis
@ 2026-05-07 7:50 ` Cyril Hrubis
2026-05-07 8:29 ` Andrea Cervesato via ltp
2026-05-07 8:34 ` [LTP] [PATCH v2 0/2] Fix proc parsing in newuname01 Andrea Cervesato via ltp
2 siblings, 1 reply; 8+ messages in thread
From: Cyril Hrubis @ 2026-05-07 7:50 UTC (permalink / raw)
To: ltp
The domainname can be empty hence we cannot use scanf() string for
format for reading the file. Use the newly added SAFE_FILE_READ_STR()
to read the strings from procfs instead.
Fixes: https://github.com/linux-test-project/ltp/issues/1304
Signed-off-by: Cyril Hrubis <chrubis@suse.cz>
---
testcases/kernel/syscalls/newuname/newuname01.c | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/testcases/kernel/syscalls/newuname/newuname01.c b/testcases/kernel/syscalls/newuname/newuname01.c
index 37058023a..995ea978e 100644
--- a/testcases/kernel/syscalls/newuname/newuname01.c
+++ b/testcases/kernel/syscalls/newuname/newuname01.c
@@ -31,16 +31,16 @@ static void run(void)
TST_EXP_EQ_STR(name->sysname, "Linux");
- SAFE_FILE_SCANF("/proc/sys/kernel/hostname", "%1023[^\n]", proc_val);
+ SAFE_FILE_READ_STR("/proc/sys/kernel/hostname", proc_val, sizeof(proc_val));
TST_EXP_EQ_STR(name->nodename, proc_val);
- SAFE_FILE_SCANF("/proc/sys/kernel/osrelease", "%1023[^\n]", proc_val);
+ SAFE_FILE_READ_STR("/proc/sys/kernel/osrelease", proc_val, sizeof(proc_val));
TST_EXP_EQ_STR(name->release, proc_val);
- SAFE_FILE_SCANF("/proc/sys/kernel/version", "%1023[^\n]", proc_val);
+ SAFE_FILE_READ_STR("/proc/sys/kernel/version", proc_val, sizeof(proc_val));
TST_EXP_EQ_STR(name->version, proc_val);
- SAFE_FILE_SCANF("/proc/sys/kernel/domainname", "%1023[^\n]", proc_val);
+ SAFE_FILE_READ_STR("/proc/sys/kernel/domainname", proc_val, sizeof(proc_val));
TST_EXP_EQ_STR(name->domainname, proc_val);
}
--
2.53.0
--
Mailing list info: https://lists.linux.it/listinfo/ltp
^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: [LTP] lib: safe_file_ops: Add SAFE_FILE_READ_STR()
2026-05-07 7:50 ` [LTP] [PATCH v2 1/2] lib: safe_file_ops: Add SAFE_FILE_READ_STR() Cyril Hrubis
@ 2026-05-07 8:26 ` linuxtestproject.agent
2026-05-07 8:29 ` Andrea Cervesato via ltp
2026-05-07 8:29 ` [LTP] [PATCH v2 1/2] " Andrea Cervesato via ltp
1 sibling, 1 reply; 8+ messages in thread
From: linuxtestproject.agent @ 2026-05-07 8:26 UTC (permalink / raw)
To: Cyril Hrubis; +Cc: ltp
Hi Cyril,
--- [PATCH 1/2] ---
On Thu, 7 May 2026, Cyril Hrubis wrote:
> lib: safe_file_ops: Add SAFE_FILE_READ_STR()
> + if (!fgets(buf, buf_size, f))
> + buf[0] = 0;
> +
> + size_t len = strlen(buf);
Move `size_t len` to the top of the function alongside `FILE *f`; mixed
declarations after executable statements violate kernel coding style.
--- [PATCH 2/2] ---
On Thu, 7 May 2026, Cyril Hrubis wrote:
> syscalls: newuname01: Fix fail on empty domainname
> Fixes: https://github.com/linux-test-project/ltp/issues/1304
`Fixes:` must reference a git commit hash in the form
`Fixes: <hash> ("<subject>")`. Use `Closes:` to reference GitHub issues.
---
Note:
Our agent completed the review of the patch.
The agent can sometimes produce false positives although often its
findings are genuine. If you find issues with the review, please
comment this email or ignore the suggestions.
Regards,
LTP AI Reviewer
--
Mailing list info: https://lists.linux.it/listinfo/ltp
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [LTP] lib: safe_file_ops: Add SAFE_FILE_READ_STR()
2026-05-07 8:26 ` [LTP] " linuxtestproject.agent
@ 2026-05-07 8:29 ` Andrea Cervesato via ltp
0 siblings, 0 replies; 8+ messages in thread
From: Andrea Cervesato via ltp @ 2026-05-07 8:29 UTC (permalink / raw)
To: linuxtestproject.agent; +Cc: ltp
Hi,
> Hi Cyril,
>
> --- [PATCH 1/2] ---
>
> On Thu, 7 May 2026, Cyril Hrubis wrote:
> > lib: safe_file_ops: Add SAFE_FILE_READ_STR()
>
> > + if (!fgets(buf, buf_size, f))
> > + buf[0] = 0;
> > +
> > + size_t len = strlen(buf);
>
> Move `size_t len` to the top of the function alongside `FILE *f`; mixed
> declarations after executable statements violate kernel coding style.
I see this is happening again. I'm gonna add a rule for it.
>
> --- [PATCH 2/2] ---
>
> On Thu, 7 May 2026, Cyril Hrubis wrote:
> > syscalls: newuname01: Fix fail on empty domainname
>
> > Fixes: https://github.com/linux-test-project/ltp/issues/1304
>
> `Fixes:` must reference a git commit hash in the form
> `Fixes: <hash> ("<subject>")`. Use `Closes:` to reference GitHub issues.
>
This is actually correct. I will change the Fixes to Closes
before merge.
Regards,
--
Andrea Cervesato
SUSE QE Automation Engineer Linux
andrea.cervesato@suse.com
--
Mailing list info: https://lists.linux.it/listinfo/ltp
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [LTP] [PATCH v2 1/2] lib: safe_file_ops: Add SAFE_FILE_READ_STR()
2026-05-07 7:50 ` [LTP] [PATCH v2 1/2] lib: safe_file_ops: Add SAFE_FILE_READ_STR() Cyril Hrubis
2026-05-07 8:26 ` [LTP] " linuxtestproject.agent
@ 2026-05-07 8:29 ` Andrea Cervesato via ltp
1 sibling, 0 replies; 8+ messages in thread
From: Andrea Cervesato via ltp @ 2026-05-07 8:29 UTC (permalink / raw)
To: Cyril Hrubis; +Cc: ltp
Reviewed-by: Andrea Cervesato <andrea.cervesato@suse.com>
--
Andrea Cervesato
SUSE QE Automation Engineer Linux
andrea.cervesato@suse.com
--
Mailing list info: https://lists.linux.it/listinfo/ltp
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [LTP] [PATCH v2 2/2] syscalls: newuname01: Fix fail on empty domainname
2026-05-07 7:50 ` [LTP] [PATCH v2 2/2] syscalls: newuname01: Fix fail on empty domainname Cyril Hrubis
@ 2026-05-07 8:29 ` Andrea Cervesato via ltp
0 siblings, 0 replies; 8+ messages in thread
From: Andrea Cervesato via ltp @ 2026-05-07 8:29 UTC (permalink / raw)
To: Cyril Hrubis; +Cc: ltp
Reviewed-by: Andrea Cervesato <andrea.cervesato@suse.com>
--
Andrea Cervesato
SUSE QE Automation Engineer Linux
andrea.cervesato@suse.com
--
Mailing list info: https://lists.linux.it/listinfo/ltp
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [LTP] [PATCH v2 0/2] Fix proc parsing in newuname01
2026-05-07 7:50 [LTP] [PATCH v2 0/2] Fix proc parsing in newuname01 Cyril Hrubis
2026-05-07 7:50 ` [LTP] [PATCH v2 1/2] lib: safe_file_ops: Add SAFE_FILE_READ_STR() Cyril Hrubis
2026-05-07 7:50 ` [LTP] [PATCH v2 2/2] syscalls: newuname01: Fix fail on empty domainname Cyril Hrubis
@ 2026-05-07 8:34 ` Andrea Cervesato via ltp
2 siblings, 0 replies; 8+ messages in thread
From: Andrea Cervesato via ltp @ 2026-05-07 8:34 UTC (permalink / raw)
To: Cyril Hrubis; +Cc: ltp
Merged, Thanks!
--
Andrea Cervesato
SUSE QE Automation Engineer Linux
andrea.cervesato@suse.com
--
Mailing list info: https://lists.linux.it/listinfo/ltp
^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2026-05-07 8:35 UTC | newest]
Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-05-07 7:50 [LTP] [PATCH v2 0/2] Fix proc parsing in newuname01 Cyril Hrubis
2026-05-07 7:50 ` [LTP] [PATCH v2 1/2] lib: safe_file_ops: Add SAFE_FILE_READ_STR() Cyril Hrubis
2026-05-07 8:26 ` [LTP] " linuxtestproject.agent
2026-05-07 8:29 ` Andrea Cervesato via ltp
2026-05-07 8:29 ` [LTP] [PATCH v2 1/2] " Andrea Cervesato via ltp
2026-05-07 7:50 ` [LTP] [PATCH v2 2/2] syscalls: newuname01: Fix fail on empty domainname Cyril Hrubis
2026-05-07 8:29 ` Andrea Cervesato via ltp
2026-05-07 8:34 ` [LTP] [PATCH v2 0/2] Fix proc parsing in newuname01 Andrea Cervesato via ltp
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox