Skip to content

Commit

Permalink
lib: handle ENOENT errors when processes exit during PID scanning
Browse files Browse the repository at this point in the history
There is a race window between readdir() and fopen() in line 125~131 of lib
function get_used_pids. A process could terminate after its directory entry
is read but before its status file is opened.

When fopen() is called, the status file may no longer exist, resulting in an
error like:

  tag=msgstress01__with_dmesg_entry stime=1723563200
  ...
  tst_test.c:1617: TINFO: Timeout per run is 0h 03m 30s
  tst_pid.c:128: TBROK: Failed to open FILE '/proc/73429/status' for reading: ENOENT (2)

To resolve this, the file_lines_scanf() function is modified to handle ENOENT
errors gracefully when strict mode is not enabled. If fopen() fails due to
ENOENT, the function now returns 1 to skip the missing file instead of treating
it as a critical error.

Reported-by: Paul Bunyan <pbunyan@redhat.com>
Analysed-by: Charles Mirabile <cmirabil@redhat.com>
Signed-off-by: Li Wang <liwang@redhat.com>
Reviewed-by: Cyril Hrubis <chrubis@suse.cz>
  • Loading branch information
wangli5665 committed Sep 21, 2024
1 parent 968e624 commit aae3633
Showing 1 changed file with 3 additions and 0 deletions.
3 changes: 3 additions & 0 deletions lib/safe_file_ops.c
Original file line number Diff line number Diff line change
Expand Up @@ -182,6 +182,9 @@ int file_lines_scanf(const char *file, const int lineno,

fp = fopen(path, "r");
if (fp == NULL) {
if (strict == 0 && errno == ENOENT)
return 1;

tst_brkm_(file, lineno, TBROK | TERRNO, cleanup_fn,
"Failed to open FILE '%s' for reading", path);
return 1;
Expand Down

0 comments on commit aae3633

Please sign in to comment.